2010-05-16 81 views
-2

我只是想知道,如果我不止一次地使用mysql_real_escape数据,它是否会有所作为?mysql_real_escape不止一次

所以,如果我在我的网站的一部分,然后再在另一部分代码中的数据溢出。这会成为一个问题吗?或者有所作为?

+9

为什么不试试它并将结果打印出来? – 2010-05-16 13:13:23

+0

'mysql_real_escape_string'不是幂等函数。 – Gumbo 2010-05-16 13:32:23

回答

3

是的。你会得到额外的不必要的反斜杠。

1

当然,数据会被双重转义。

根本不应该使用mysql_real_escape(),通过mysqli的参数化查询一直存在很长时间。

+0

@谁低估了这一点:解释本来不错。 – Tomalak 2010-05-16 15:09:39

1

不可能区分转义字符串和非转义字符串,因为看起来像转义字符串的东西是预期的非转义字符串。因此,试图再次逃跑,将逃避逃跑 - 而逃脱的文本将成为MySQL读取的内容。

因此,你不应该多次逃脱。

但是,更好的解决方案是使用参数化查询,因为那样你根本不需要转义。

2

是的,这将是一个问题。

例如:
如果一个是“乔的家”,第一个电话会产生“乔\之家”,第二个会产生“乔\\\之家”,节约反斜杠在数据库中。

这与Web服务器启用魔术引号时出现的问题类似,并且您在客户端的输入上使用了mysql_real_escape_string。这是通过解决:

if (! get_magic_quotes_gpc()) { 
    $value = mysql_real_escape_string($_GET["value"]); 
} else { 
    $value = mysql_real_escape_string(stripslashes($_GET["value"])); 
} 

(对于后者例如参见http://www.php.net/get_magic_quotes_gpc

[I编辑的答案,以反映在下面的评论更正]

+0

魔术引号与mysql(i)_(real)_escape字符串不会执行相同的转义。如果您无法禁用魔术引号,正确的方法是使用反斜杠将其除去,然后在必要时应用转义(即,如果您不能使用参数化查询)。理想情况下,您可以在一开始就摆脱魔术引号,以避免每次需要在非数据库环境中输出魔术引号。 – 2010-05-16 13:16:34

+0

因为你的分数,我不会低调,但这种做法是错误的。转义应该只是'$ value = mysql_real_escape_string($ _ GET [“value”]); ** **无条件**。摆脱魔术引语是另一件应该在查询撰写之前完成的事情,在脚本的最顶端。 – 2010-05-16 13:17:21

+0

如果在最后一个条件中没有执行'$ value = mysql_real_escape_string(stripslashes($ _ GET [“value”]));那么我将不得不倒退。 – 2010-05-16 13:17:23

1

是的,这将是一个过擒纵问题。任何逃跑都是一样的,不管它究竟是什么。举例来说,如果你想逃避字符串双引号以下共同的规则:一个转义成为

bla \"foo\" 

bla "foo" 

经过两次成为

bla \\\"foo\\\" 

等之后。 “unes​​capements”的数量必须与“擒纵系统”的数量完全匹配。您可以在某些网站上看到此问题的表现形式,这些网站超出了文本字段中的某些字符,因此输出时简单的撇号变为\'

0

是的,它的确与众不同:

$string = "I'm Chuck!"; 
mysql_escape_string($string); // I\'m Chuck! 
mysql_escape_string(mysql_escape_string($string)); // "I\\\'m Chuck! 
8

正确的地方mysql_real_escape是您发送的查询保存数据之前。 脚本中的其他任何地方都是主要的设计缺陷。

这当然应该最好在一个自己的db级中。

+0

有史以来最伟大的一点!我应该自己记下它。 – 2010-05-16 13:28:59

+0

这是正确的地方,但不是解决问题的最佳方式。 – 2010-05-16 13:42:37

+0

@Blair小心解释一下?什么问题和什么是最好的? – 2010-05-16 13:47:07