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()

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '\\' AND s1.MERCHANT_ID=me.MERCHANT_ID' 附近使用正确的语法

没有mysql_real_escape_string()我得到:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '\' AND s1.MERCHANT_ID=me.MERCHANT_ID' 附近使用正确的语法

我不确定这是怎么回事?任何帮助将不胜感激。

4

4 回答 4

6

如果它是一个 id,我假设是数字的,你为什么不把它转换成一个整数呢?

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

我能给你的最好建议是检查 PDO并使用绑定参数。

于 2011-04-07T00:27:39.577 回答
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、控制字符等时)

于 2011-04-07T00:31:08.500 回答
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' ...
于 2011-04-07T00:33:43.260 回答
1

Phil Brown 是对的,但是您应该忘记老式的mysql_real_escape_string or mysql_connect(),因为它们已经很老了,并转移到 php 的 PDO() 中,您可以在其中使用准备好的语句、绑定、获取对象任何更多的功能。

如果您想要 SQL 注入的下一代数据库操作和安全性,我建议阅读http://php.net/manual/en/book.pdo.php上的 PDO 文档。

于 2011-04-07T01:19:29.837 回答