mysql_real_escape_string()没有清理变量

Lie*_*nau 4 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");
Run Code Online (Sandbox Code Playgroud)

如果我在网址的末尾添加一个',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'附近使用正确的语法

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

ale*_*lex 6

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

$ID = (int) $_GET['ID'];
Run Code Online (Sandbox Code Playgroud)

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

  • @Dinah:他们都纠正了.事实上,Frank Farmer,mysql _...不添加引号,而alex - 数字不应该用引号括起来,而是用作数字(这会导致转换/性能问题) (2认同)

Fra*_*mer 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");
Run Code Online (Sandbox Code Playgroud)

更一般地说,我倾向于将这两个包装在一个函数中,例如:

function quoteValue($value) {
    return "'" . mysql_real_escape_string($value) . "'";
}
Run Code Online (Sandbox Code Playgroud)

这很有用,因为您可能会发现需要更精确的引用行为的行(特别是在处理Unicode,控制字符等时)