我正在尝试阻止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,因为我将不得不寻找获取值来删除斜杠的所有用法。
答案 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