mysql_real_escape_string()未对变量进行净化处理

4

我正在处理一个现有网站,试图防止SQL注入攻击。在此之前,$_GET['ID'] 是未经过滤的。

$ID=mysql_real_escape_string($_GET['ID']);
$sQuery=mysql_query("select * from tbl_mini_website as s1, tbl_actor_merchant as me where s1.MERCHANT_ID=$ID AND s1.MERCHANT_ID=me.MERCHANT_ID");

如果在URL末尾放置单引号,使用mysql_real_escape_string()函数后,从mysql_error()获得以下结果:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\\' AND s1.MERCHANT_ID=me.MERCHANT_ID' at line 1

如果不使用mysql_real_escape_string()函数,将会获得以下结果:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\' AND s1.MERCHANT_ID=me.MERCHANT_ID' at line 1

我不确定出了什么问题,如果能提供帮助将不胜感激。

如果在执行查询之前使用 echo 命令会发生什么? - zerkms
4个回答

6

如果它是一个id,我假设是数字,为什么不直接将其转换为整数?

$ID = (int) $_GET['ID'];

我能给你的最好建议是查看PDO并使用绑定参数。在IT技术中,绑定参数是一种更安全、更有效的方法来处理数据库查询。

可能不行,否则原始解决方案将适用于整数字段。我认为Frank正确地添加了引号。 - Dinah
2
@Dinah:两者都是正确的。事实上,Frank Farmer指出mysql_...不添加引号,而alex指出数字不应该用引号括起来,而应该作为数字使用(这可能会导致强制转换/性能问题)。 - zerkms

5

mysql_real_escape_string可以进行转义,但是不会引用。

建议使用:

$sQuery=mysql_query("select * from tbl_mini_website as s1, tbl_actor_merchant as me where s1.MERCHANT_ID='$ID' AND s1.MERCHANT_ID=me.MERCHANT_ID");

更一般地说,我倾向于将这两个内容封装在一个函数中,例如:
function quoteValue($value) {
    return "'" . mysql_real_escape_string($value) . "'";
}

这非常有用,因为您可能会发现在处理Unicode、控制字符等方面,您需要更加精细的引用行为。


谢谢!!我已经在这上面工作了一个小时,它就在我的鼻子底下。 - Lienau

2

这是因为你没有引用该变量。

以下是您提供的输入所得到的查询结果:

$_GET['ID'] = "1";
$ID=mysql_real_escape_string($_GET['ID']);
SELECT ... where s1.MERCHANT_ID=1 ...

$_GET['ID'] = "1'"
$ID=mysql_real_escape_string($_GET['ID']);
SELECT ... where s1.MERCHANT_ID=1\' ...

$_GET['ID'] = "1'"
SELECT ... where s1.MERCHANT_ID=1' ...

1

Phil Brown说得没错,但你应该忘掉老式的mysql_real_escape_string或mysql_connect(),因为它们非常老旧,转而使用PHP的PDO(),在那里你可以使用预处理语句、绑定、获取对象等许多更多的函数。

如果你想要下一代数据库操作和防止SQL注入攻击的安全性,请阅读http://php.net/manual/en/book.pdo.php中的PDO文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接