根據服務器的不同配置,在通過post、get獲得數據時可能出現一些類似於 ',"等特殊符合會被轉義。這個問題主要由PHP魔術引號引起。PHP魔術引號包括 magic_quotes_gpc,magic_quotes_runtime,magic_quotes_sybase。
magic_quotes_gpc 總結如下:
1. 對於magic_quotes_gpc=on的情況,我們可以不對輸入和輸出數據庫的字符串數據作 addslashes()和stripslashes()的操作,數據也會正常顯示。 如果此時你對輸入的數據作了addslashes()處理, 那麼在輸出的時候就必須使用stripslashes()去掉多余的反斜槓。2. 對於magic_quotes_gpc=off 的情況
必須使用addslashes()對輸入數據進行處理,但並不需要使用stripslashes()格式化輸出 因為addslashes()並未將反斜槓一起寫入數據庫,只是幫助mysql完成了sql語句的執行。關於php注入中的magic_quotes_gpc magic_quotes_gpc = on
大家都知道php配置文件php.in ,如果裡面的magic_quotes_gpc 配置被打開 那就是magic_quotes_gpc = on 懂點php的人都知道。
那我們就要對數值型的字段注入。
1 <? 2 if ( isset($_POST["f_login"] ) ){ 3 //連接數據庫 4 $t_strUid = $_POST["f_uid"]; 5 $t_strPwd = $_POST["f_pwd"]; 6 $t_strSQL = "SELECT * FROM tbl_users WHERE uid=$t_strUid AND password = '$t_strPwd' LIMIT 0,1"; 7 if ( $t_hRes = mysql_query($t_strSQL) ){ 8 // 成功查詢 9 } 10 } 11 ?>
1 <html> 2 <head> 3 <title>sample test</title> 4 </head> 5 <body> 6 <form method=post action=""> 7 User ID: <input type="text" name="username" size=30><br> 8 Password: <input type=text name="userpwd" size=30><br> 9 <input type="submit" name="user_login" value="登錄"> 10 </form> 11 </body>
如果正確輸入:
SELECT * FROM tbltable_users WHERE userid=admin AND password = 'admin' LIMIT 0,1
如果攻擊者在username處,輸入:admin OR 1 =1 #,則注入的sql語句如下:
SELECT * FROM table_users WHERE userid=admin OR 1 =1 # AND password = 'admin' LIMIT 0,1
下面就可以進行注入了.
在php.ini 中把display_errors 選項設為display_errors = off 這樣就可以防止.
magic_quotes_runtime
如果打開的話,大部份從外部來源取得數據並返回的函數,包括從數據庫和文本文件,所返回的數據都會被反斜線轉義。該選項可在運行的時改變,在 PHP 中的默認值為 off。
magic_quotes_sybase
如果打開的話,將會使用單引號對單引號進行轉義而非反斜線。此選項會完全覆蓋 magic_quotes_gpc。如果同時打開兩個選項的話,單引號將會被轉義成 ”。而雙引號、反斜線 和 NULL 字符將不會進行轉義。
由於不同服務器的配置不同,需要在代碼中用get_magic_quotes_gpc() 檢測服務器配置。
1 if(isset($_POST['c'])){ 2 $s = $_POST['c']; 3 if(get_magic_quotes_gpc()) 4 $s = stripslashes($s);//stripslashes() 函數刪除由 addslashes() 函數添加的反斜槓。 5 //do something 6 }