變數在 xx 的處理方式

這陣子抓 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)

10 thoughts on “變數在 xx 的處理方式”

  1. 確定是數字的欄位可以用 ctype_digit() 檢查, 或是 intval() 再轉成數字一次.

    ctype_* 系列的 function 可以用來檢查特定內容的變數.

  2. rawurlencode似乎更符合標準(RFC1387 !?)

    htmlspecialchars跟htmlentities似乎差不多..
    不知道選哪個好..

Leave a Reply

Your email address will not be published. Required fields are marked *