2010-11-09 72 views
1

我有以下的select語句:逃離串

$res = mysql_query("select * from Table where Name='{$_REQUEST['name']}'"); 

然而,由於這種查詢很容易受到SQL注入,我使用選擇一個更安全的方式:

$escaped_name=mysql_real_escape_string($_REQUEST['name']); 
$res = mysql_query("select * from Table where Name='{$escaped_name}'"); 

它一切正常,直到我嘗試運行包含字符串Joel's$_REQUEST['name']的選擇。在這種情況下,選擇不起作用。調試和印刷$escaped_name內容到屏幕後,我得到了以下內容:

Joel\\\'s 

,這是什麼原因呢?看起來這個字符串是自動轉義的,然後我再次逃脫了。

回答

5

該數據可能被PHP的(不贊成使用)「magic quotes」功能自動轉義。要在.htaccess禁用魔術引號:

php_flag magic_quotes_gpc off 
php_flag magic_quotes_runtime off 
+0

+1!請注意,您也可以在php.ini中禁用此功能(當然)。 – jwueller 2010-11-09 11:35:20

0

不知道你是什麼意思的「運行選擇」,但我想你說什麼,你有魔術報價打開。

如果你沒有訪問php.ini文件或者檢查phpinfo()或將其添加到文件:

if(get_magic_quotes_gpc()){ 
    echo "on"; 
}else{ 
    echo "off"; 
} 

如果它們被打開,他們可以在不同的地方,如php.ini或任何被禁用。 htaccess文件

2

你碰上引起的「功能」被稱爲魔術引號在PHP中的問題。啓用Magic Quotes時,PHP會嘗試轉義字符串,但由於不同的數據庫具有不同的轉義方案,結果可能非常無用,甚至是危險的。

有兩種可能的解決方案。最簡單並且推薦的解決方案是在php.ini或.htaccess中關閉魔術引號。

第二種方法是使用magic_quotes_gpc來測試功能是否啓用,然後在輸入上運行stripslashes(如果是)。然後在結果上運行mysql_real_escape_string。

+0

聽起來很想把它關掉,但是如果你在運行查詢之前忘了逃避一個字符串,這似乎是一個很好的回退。謝謝! – Joel 2010-11-09 11:42:15

+3

這不是一個很好的後備。這不是可靠的跨數據庫和跨字符集,它會破壞你要做的字符串*記住要逃避/ parameterise或者你在SQL以外的其他上下文中使用的字符串。這是一團糟,它將在未來的PHP版本中消失。 – bobince 2010-11-09 12:09:56

0

最安全的方法是使用prepared statements避免逃逸。自動轉義由magic quotes引起,可以使用these methods禁用。

即時解決(假設您啓用魔術引號)將是:

mysql_real_escape_string(stripslashes($_REQUEST['name']));