2010-11-09 43 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']));