2012-11-09 47 views
0

这可能是常见的事情,但我有一个问题。允许撇号,同时仍然保持mysql_real_escape_string()标记。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

使用PDO或mysqli的,[阅读文章的详细信息:防止SQL注入的最佳方式(http://stackoverflow.com/questions/60174/best-way-to -prevent-sql -injection) –

+0

mysql_real_escape_string会为你处理。你得到的错误是从MySQL而不是PHP是吗? – case1352

+0

为什么你在'mysql_real_escape_string'已经为你逃脱之后仍然在剥离斜线? – Gapton

回答

3

您链接mysql_real_escape_stringstripslashes的结果,基本上删除了所有为安全原因添加的所有内容mysql_real_escape_string

所以,如果你有$stadium_name= "Fred's Stadium";输入mysql_real_escape_string($stadium_name)返回"Fred\'s Stadium"可以纳入你的查询安全产生

例如MySQL查询。在mysql_real_escape_string输出调用stripslashes前面删除\的'所以你发送的查询

"SELECT * FROM `stadiums` WHERE `stadium_name` = 'Fred's Stadium'" 

到MySQL认为你的字符串为‘弗雷德’其次是一些垃圾(可以变成是危险的)。

解决方案是使用单独的变量来存储mysql_real_escape_string的结果,因为它在数据库查询中的使用是正确的,但不适合显示给用户。

我希望这会有所帮助。

问候

TC

+0

因此,使用mysql_real_escape_string存储它,但是在显示时使用strip_slashes? – nn2

+0

是的,并且在回显它之前使用php.net/htmlentities,这样你就不会将HTML注入到你的页面中。 – TheConstructor

1

你的问题是这样的:

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

stripslashes()撤消逃逸。

您可能已经看到该函数用作magic_quotes的解决方法。如果你要申请它,那么请在之前这个数据库转义函数。