【问题标题】:mysql_real_escape more than once [duplicate]mysql_real_escape 不止一次[重复]
【发布时间】:2010-05-16 13:08:58
【问题描述】:

我只是想知道如果我不止一次 mysql_real_escape 数据是否会有所不同?

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

【问题讨论】:

  • 为什么不直接尝试并打印结果呢?
  • mysql_real_escape_string 不是幂等函数。

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


【解决方案1】:

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

当然最好在自己的数据库类中。

【讨论】:

  • 这是正确的地方,但不是处理问题的最佳方式。
  • @Blair 需要解释一下吗?什么问题,什么是最好的?
  • 处理注入的问题。参数化查询是一种更好的处理方式。但就像我说的那样,您的回答提供了执行 OP 要求的正确位置。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    是的,这将是一个问题。

    例如:
    如果 a 是“Joe's House”,第一个调用将产生“Joe\'s House”,第二个调用将产生“Joe\\\'s 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

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

    【讨论】:

    • 魔术引号不执行与 mysql(i)_(real)_escape 字符串相同的转义。如果您无法禁用魔术引号,正确处理魔术引号的方法是使用带斜线删除它们,然后在必要时应用转义(即,如果您不能使用参数化查询)。理想情况下,您应该在一开始就摆脱魔术引号,以避免每次需要在非数据库上下文中输出它们时都必须剥离它们。
    • 我不会因为你的分数而投反对票,但这种方法是错误的。转义应该只是$value = mysql_real_escape_string($_GET["value"]); 无条件。摆脱魔术引号是另一件事,应该在查询编写之前完成,在脚本的最顶部。
    • 如果你在最后一个条件下不做$value = mysql_real_escape_string(stripslashes($_GET["value"]));,我将不得不对你投反对票。
    • 对不起,伙计们,我不知道。感谢您提供的信息,我也会更正我的代码:-)
    • @Alix 但这种方法也是错误的。只需让数据库单独转义。它与魔术引号无关。出于多种原因,Maguc 斜线必须被剥离。你的应用不就只有这一行吗?
    【解决方案4】:

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

    bla "foo"
    

    一个转义后变成

    bla \"foo\"
    

    两个之后变成

    bla \\\"foo\\\"
    

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

    【讨论】:

      【解决方案5】:

      无法区分转义字符串和未转义字符串,因为看起来像转义字符串的东西是预期的未转义字符串。因此,再次尝试转义,将逃脱转义 - 转义一次的文本将是 MySQL 读取的内容。

      因此,您永远不应该多次逃脱。

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

      【讨论】:

        【解决方案6】:

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

        您根本不应该使用mysql_real_escape(),通过mysqli 进行的参数化查询已经存在了足够长的时间。

        【讨论】:

        • @谁对此投了反对票:解释会很好。
        【解决方案7】:

        是的,这很重要:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-02
          • 1970-01-01
          • 2016-11-14
          • 1970-01-01
          • 2020-01-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多