这可能很常见,但我有一个问题。在保持mysql_real_escape_string()
标记的同时允许撇号。
我有这个:$name = stripslashes(mysql_real_escape_string($_POST['stadium_name']));
我测试了它:
$getInfoX = mysql_fetch_array(mysql_query("SELECT * FROM `stadiums` WHERE `stadium_name` = '$stadium_name'")) or die(mysql_error());
我可以做一个示例注入像x'; DROP TABLE members; --
或带有撇号的名称,如Stade de l'Aube
...但是带有撇号的名称会给我一个错误,如:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Aube'' at line 1
我该怎么办?
答案 0 :(得分:3)
您将mysql_real_escape_string
的结果链接到stripslashes
,这基本上会删除因安全原因而添加的所有内容mysql_real_escape_string
。
因此,如果您有$stadium_name= "Fred's Stadium";
作为输入mysql_real_escape_string($stadium_name)
,则返回"Fred\'s Stadium"
可以包含在您的查询中,安全生成
"SELECT * FROM `stadiums` WHERE `stadium_name` = 'Fred\'s Stadium'"
作为MySQL查询。在stripslashes
输出上调用mysql_real_escape_string
会删除'前面的\,因此您发送查询
"SELECT * FROM `stadiums` WHERE `stadium_name` = 'Fred's Stadium'"
到MySQL认为你的字符串是'Fred'后跟一些垃圾(这可能会变成危险)。
解决方案是使用单独的变量来存储mysql_real_escape_string的结果,因为它适用于数据库查询,但不适合显示给用户。
我希望这会有所帮助。
此致
TC
答案 1 :(得分:1)
你的问题是:
$name = stripslashes(mysql_real_escape_string($_POST['stadium_name']));
stripslashes()
撤消逃跑。
您可能已经看到该函数用作magic_quotes
的变通方法。如果您要应用它,那么在之前执行数据库转义功能。