mysql_real_escape_string()没有清理变量

时间:2011-04-07 00:25:40

标签: php mysql-real-escape-string

我正在尝试阻止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");

如果我在网址的末尾添加了mysql_real_escape_string(),我会从mysql_error()获取此信息:

  

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

没有mysql_real_escape_string()我得到:

  

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

我不确定它是什么?任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分: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,控制字符等时)。

答案 2 :(得分: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' ...

答案 3 :(得分:1)

菲尔·布朗是对的,但你要忘记老式的mysql_real_escape_string or mysql_connect(),因为他们已经很老了,转而使用php的PDO(),你可以使用预备语句,绑定,获取对象以及更多的函数。

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