做為一個合格的web開發人員,一定會牢記一個原則――永遠不能相信用戶輸入的數據,行走江湖,安全第一是很重要的。用戶通過表單或url傳過來的數據,一定要仔細檢查過了,才往后臺數據庫里存進去。在一個成熟的開發團隊里,貫徹這個原則不成問題;但是如果在一個新人老手混搭的小team里,很容易就忽視了這個問題,那么各種安全漏洞比如跨站攻擊,sql注入等等真是防不勝防。
實際上,用php 5自帶的filter擴展能夠較好的解決這個問題。我在從前的blog里記錄了filter擴展的常規用法――直接利用filter來校驗數據,這樣有不少額外的代碼量,所以我得介紹一個比較偷懶的辦法――自動對所有輸入變量進行過濾,這只需要對php.ini增加一行配置,然后重啟apache或fastcgi讓php配置生效。
filter.default="special_chars"
開啟了這項配置后,會自動使用filter_input方法對$_GET, $_POST, $_COOKIE, $_REQUEST以及$_SERVER變量進行過濾轉義。配置中special_chars是常量FILTER_SANITIZE_SPECIAL_CHARS的縮寫,它能自動轉義大部分危險字符例如: '"<>。而php手冊對它的解釋是:
HTML-escape '"<>& and characters with ASCII value less than 32, optionally strip or encode other special characters.
在這個情況下,新人們寫出這樣的代碼我也不會太擔心:
PHP:
$foo = $_GET['foo'];
echo $foo;
在部分場合,我們可能還是需要未轉義的變量,比如某個ajax接受的參數是一段json串,用這段代碼即可獲得原始數據:
PHP:
$foo = filter_input (INPUT_GET, 'foo', FILTER_UNSAFE_RAW);
fitler擴展與yahoo使用的yiv如出一轍,印象里似乎就是yahoo對yiv做了些修改貢獻給php社區,但是暫時沒找到出處。
原文轉自:http://blogread.cn/it/article/1515