mysql_real_escape_string()单引号的不同行为

时间:2011-12-08 10:55:04

标签: php mysql sql-injection

我正在尝试阻止sql注入 为此,我使用mysql_real_escape_string()。

在我的本地服务器上(phpversion 5.3.2):

$string="a'b"
$newstring=mysql_real_escape_string($string);  

query("INSERT INTO .. ..field1='$newstring'");

将$ newstring插入表中会出现“a'b” 在另一台服务器(phpversion 5.2.10)上,它将“a \'b”放入表中。

如何插入“a'b”并避免注射?
我不想对INI文件和magic_quotes进行更改,因为它会影响其他查询 我不能使用add_slashes,因为我将不得不寻找获取值来删除斜杠的所有用法。

5 个答案:

答案 0 :(得分:0)

最可能的问题是您在一台服务器上启用了magic_quotes,而在另一台服务器上启用了magic_quotes。 禁用magic_quotes或更改为代码:

$example = stripslashes($_POST['example']);      //undoes the magic_quotes
$escaped_string = mysql_real_escape_string($example); //escapes it properly.

如果您有2个连接到2个不同的数据库服务器,则可能会出现不太可能的情况

mysql_real_escape_string根据您打开的连接而有所不同。
如果您有多个服务器,因此有多个连接,则需要为每个连接运行一次转义功能。

实施例

$example = "a'b";
$connectionA = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$connectionB = mysql_connect('remotehost', 'mysql_user', 'mysql_password');
$escapedstringA = mysql_real_escape_string($example, $connectionA);
$escapedstringB = mysql_real_escape_string($example, $connectionB);

如果在调用mysql_real_escape_string时遗漏了连接参数,则两个转义字符串都将使用remotehost的默认编码进行转义,这是不正确的。

此代码可能不正确:

$example = "a'b";
$connectionA = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$connectionB = mysql_connect('remotehost', 'mysql_user', 'mysql_password');
$escapedstringA = mysql_real_escape_string($example);  //uses remotehost's encoding
$escapedstringB = mysql_real_escape_string($example);   

答案 1 :(得分:0)

这可能与mysql_real_escape_string()无关,而与magic_quotes设置无关。

最好的办法是关闭魔术引号,as even the PHP manual itself recommends.

如果真的不可能,here就是如何从PHP代码中“禁用”魔术引号的示例。

答案 2 :(得分:0)

这确实是一个神奇的引用问题。你唯一能做的就是检测魔法qoutes并去除斜线。您可以使用一些脚本来实现全局工作

检查这里的评论

http://php.net/manual/en/security.magicquotes.disabling.php

如果您不想全局使用它,请在该变量上使用if条件和条带斜杠

答案 3 :(得分:0)

如果启用了magic_quotes_gpc,请先将stripslashes()应用于数据。对已经转义的数据使用此函数将两次转义数据。

if(get_magic_quotes_gpc()) {
    $newstring = stripslashes($newstring);
}

答案 4 :(得分:0)

  

我正在尝试阻止sql注入   为此,我使用mysql_real_escape_string()。

看看这个问题,对你来说可能很有意思:Apparently there is an SQL injection bug in my PHP code

简而言之,“使用mysql_real_escape_string”不足以“防止sql注入”。 它仅适用于字符串,但对于其他部分,您需要不同的方法。 有关详细信息,请参阅我之前关于此事的答案:https://stackoverflow.com/a/2995163/285587