這陣子抓 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)
。
htmlentities沒辦法避免IE6一些"聰明的"特性
例如全形的"<"依然當作"<"來解釋
不知道長輩有沒有試過 HTML Purifier
http://shiflett.org/blog/2007/jun/html-purifier
我測試的結果相反:
http://netnews.nctu.edu.tw/~gslin/a.html
確定是數字的欄位可以用 ctype_digit() 檢查, 或是 intval() 再轉成數字一次.
ctype_* 系列的 function 可以用來檢查特定內容的變數.
借轉借轉~~感謝
rawurlencode似乎更符合標準(RFC1387 !?)
htmlspecialchars跟htmlentities似乎差不多..
不知道選哪個好..
是RFC1738...
不,放在 GET 參數裡面是用
urlencode()
,把空白轉成 "+" 而非 "%20"。