變數在 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)
This entry was posted in Computer, Murmuring, Network, Programming, Security, WWW. Bookmark the permalink.

10 Responses to 變數在 xx 的處理方式

  1. teds says:

    htmlentities沒辦法避免IE6一些"聰明的"特性
    例如全形的"<"依然當作"<"來解釋

    不知道長輩有沒有試過 HTML Purifier
    http://shiflett.org/blog/2007/jun/html-purifier

  2. slzzp says:

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

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

  3. cmchen says:

    借轉借轉~~感謝

  4. Pingback: 變數在 xx 的處理方式 at BlueCat is sleepy

  5. BUG says:

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

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

  6. BUG says:

    是RFC1738...

  7. Gea-Suan Lin says:

    不,放在 GET 參數裡面是用 urlencode(),把空白轉成 "+" 而非 "%20"。

  8. Pingback: PHP SQL Injection 和 XSS 的偵測程式 和 程式撰寫注意事項 - 2008 | 鬼仔's Blog

  9. Pingback: PHP SQL Injection 和 XSS 的偵測程式 和 程式撰寫注意事項 - 2008 - Tsung's Blog

Leave a Reply

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