這陣子抓 bug 的時候發現連自己都要想半天,還是整理起來好了... 假設 $v 是未經過濾的變數,要放到不同地方要做不同的處理:
- MySQL Statement:這已經是標準了,
mysql_escape_string($v)
或是mysql_real_escape_string($v)
,或是改用 prepare + execute 的模式。 - 放在 HTML Form 的 input 元素裡面:要用
htmlentities($v, ENT_QUOTES)
過濾後用 double-quote 包起來,原因是 $v 可以是"><script> ... (一堆邪惡 js 程式碼) ... </script>"
,這是一種 XSS 攻擊。 - 放在網址的 GET 參數裡:用
urlencode($v)
。 - 呼叫外部程式帶入參數時 (像是
system()
呼叫):用escapeshellarg($v)
。