mysql_real_escape_string()但允许带撇号的名称

时间:2012-11-09 02:41:48

标签: php mysql

这可能很常见,但我有一个问题。在保持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

我该怎么办?

2 个答案:

答案 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的变通方法。如果您要应用它,那么在之前执行数据库转义功能。