我正在尝试阻止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'附近使用正确的语法
我不确定它是什么?任何帮助将不胜感激。
答案 0 :(得分:6)
答案 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文档。