0

这可能是一件常见的事情,但我有一个问题。允许使用撇号,同时仍保留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

我该怎么办?

4

2 回答 2

2

您链接结果,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

于 2012-11-09T02:54:11.057 回答
1

你的问题是这样的:

$name = stripslashes(mysql_real_escape_string($_POST['stadium_name']));

stripslashes()撤消转义。

您可能已经看到该函数用作magic_quotes. 如果要应用它,请在数据库转义功能之前执行此操作。

于 2012-11-09T02:53:57.277 回答