1、古老的欺騙sql語句
在默認模式下,即使是你忘了把php.ini拷到/usr/local/lib/php.ini下,php還是打開magic_quotes_gpc=on。
這樣所有從get/post/cookie來的變量的單引號(')、雙引號(")、反斜槓backslash()以及空字元nul
(the null byte)都會被加上反斜槓,以使數據庫能夠正確查詢。
但是在php-4-rc2的時候引入了一個配置文件php.ini-optimized,這個優化的php.ini卻是
magic_quotes_gpc=off的。某些網管看到optimized字樣也許就會把php.ini-optimized拷到
/usr/local/lib/php.ini,這時就比較危險。像比較簡單的驗證,假設沒有過濾必要的字符:
select * from login where user='$http_post_vars[user]' and pass='$http_post_vars[pass]'
我們就可以在用戶框和密碼框輸入1『 or 1='1通過驗證了。這是非常古董的方法了,這個語句會
替換成這樣:
select * from login where user='1' or 1='1' and pass='1' or 1='1'
因為or 1='1'成立,所以通過了。
解決的辦法最好就是過濾所有不必要的字符,還有就是推薦對於從get/post/cookie來的並且用在sql
中的變量加一個自定義的函數:
function gpc2sql($str) {
if(get_magic_quotes_gpc()==1)
return $str;
else
return addslashes($str);
}
主要是為了你的程序能安全移植在各種系統裡。
閱讀全文...