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'附近使用正确的语法 我不确定它是什么?任何帮助将不胜感激。     
已邀请:
如果它是一个id,我假设数字,你为什么不把它转换为整数?
$ID = (int) $_GET['ID'];
我能给你的最好建议是检查PDO并使用绑定参数。     
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,控制字符等时)     
这是因为你没有引用变量。 这是您给出以下输入的查询
$_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' ...
    
菲尔布朗是对的,但是你要忘记老式的
mysql_real_escape_string or mysql_connect()
,因为他们已经很老了,转而使用php的PDO(),你可以使用预备语句,绑定,获取任何更多功能的对象。 如果你想要下一代dabatase操作和SQL Injection的安全性,我建议你在http://php.net/manual/en/book.pdo.php阅读PDO文档。     

要回复问题请先登录注册