mysql_real_escape不止一次

时间:2010-05-16 13:08:59

标签: php mysql mysql-real-escape-string flawed-concept

我只是想知道如果我多次使用mysql_real_escape数据是否会产生影响?

因此,如果我在我的网站的一部分中转发数据,然后再在另一部分代码中转义。这会是个问题吗?还是有所作为?

7 个答案:

答案 0 :(得分:8)

mysql_real_escape的正确位置是之前您发送查询以保存数据。 脚本中任何其他位置的每个其他实例都是一个主要的设计缺陷。

当然,最好是在自己的db-class中。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

是的,这将是一个问题。

例如:
如果 a 是“Joe's House”,第一个调用将生成“Joe's House”,第二个调用将生成“Joe \\\ House”,从而在数据库中保存反斜杠。

这类似于当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

[我编辑了答案以反映下面评论中的更正]

答案 3 :(得分:1)

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

你根本不应该使用mysql_real_escape()mysqli的参数化查询已经坚持了很长时间。

答案 4 :(得分:1)

无法区分转义字符串和非转义字符串,因为看起来像转义字符串的字符串是预期的未转义字符串。因此,试图再次逃脱,将逃避逃避 - 并且逃脱一次的文本将是MySQL读取的。

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

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

答案 5 :(得分:1)

是的,这将是一个过度擒纵的问题。对于任何转义,这都是相同的,无论它究竟是什么。例如,如果您按照通用规则转义字符串中的双引号:

bla "foo"

一次逃脱后

bla \"foo\"

之后

bla \\\"foo\\\"

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

答案 6 :(得分:0)

是的,它有所不同:

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