【问题标题】:MySQL / PHP problem with " and '“和”的MySQL / PHP问题
【发布时间】:2010-10-26 06:59:06
【问题描述】:

我使用 PHP 和 MySQL 用 cmets 制作了一个简单的新闻系统,它在我的本地 Apache 服务器上运行良好,无论是在我的 Fedora 10 机器上还是在我的 Windows 7 机器上。但是现在我遇到了一个问题,我将它上传到了一个网络主机,它不断返回所有的 ' 和 " 作为 \' 和 \"。

我相信这要么是出于安全原因自动添加它们的 Web 主机,要么是 MySQL 是错误的排序规则,但我还没有能够解决它,测试了多个 MySQL 排序规则。

下面是一个查询示例:

mysql_query("INSERT INTO news (title, poster, text, time) VALUES ('$newstitle', '1', '$newstext', '$time')") or die(mysql_error());

$timetime(); $newstitle$newstext 是从 $_POST 解析的,并且在我运行查询之前都通过 mysql_real_escape_string() 运行(我想这可能是问题所在,但由于它是我不想要的安全性的一部分删除它,因为它不会在我的本地服务器上造成问题)

最后一点:在我的本地 apache 服务器上,latin1_swedish_ci 在 web 主机服务器上不起作用。

编辑:

它们在数据库中看起来像这样:

\'\'\'\"\"\"

虽然在我的本地,他们没有额外的反斜杠,所以它必须是 PHP 添加它。除了添加一个删除多余反斜杠的函数之外,还有什么方法可以解决这个问题?

【问题讨论】:

  • 我相信我已经做到了:P 还是我做错了?
  • 正如我在评论我自己的答案时所说,如果您选择 Gumbo 的答案会更好,因为他是第一个提出正确解决方案的人,而不是一个“不是真正的解决方案”的解决方案;)

标签: php mysql collation


【解决方案1】:

这些额外的反斜杠可能是Magic Quotes。在处理数据之前尝试disable them or remove them

【讨论】:

  • 这实际上是正确的答案——mysql_real_escape_string 将转义字符以便您可以插入它们,但是当从数据库中拉回数据时,这些转义将不存在。
【解决方案2】:

不,您不想运行 stripslashes()。相反,请正确设置您的服务器。

首先,关闭magic_quotes。这意味着进入脚本的任何数据都不会被转义。

然后在数据上运行 mysql_real_escape_string(),这将只为查询添加斜线,并将数据存储在数据库中而没有斜线。

当您再次加载数据时,一切顺利,引号周围不会有任何反斜杠。

【讨论】:

    【解决方案3】:

    编辑:正如下面多次提到的,在 cmets 中,解决此问题的正确方法是禁用魔术引号。如果我在回答之前完全阅读并理解了这个问题,那可能会更好;)


    mysql_real_escape_string() 将按照它所说的去做,并转义字符串中的相关字符。转义引号是通过在它们前面加上转义字符(PHP 和许多其他语言中的反斜杠)来完成的。 当您从数据库中拉回数据时,对内容执行类似运行stripslashes()(参见PHP doc)的操作,以删除引号等内容中的斜线。

    编辑:正如 Gumbo 提到的,这也可能是由于在服务器上启用了魔术语录。你应该禁用这些as per his answer

    【讨论】:

    • 你的本地服务器很可能有 magic_quotes_gpc = off,而他们的服务器有 magic_quotes_gpc = on。
    • 刚刚编辑了帖子,可能是启用了魔术语录(提醒 Gumbo 的帽子提示)。
    • 说到魔术行情,当这个“功能”最终在 PHP6 中消失时,我会很高兴。
    • 不能再同意了 - 这是我期待 PHP6 的几项改进之一!
    • 您可以将“php_flag magic_quotes_gpc Off”行放在您的 .htaccess 中以禁用它。
    【解决方案4】:

    查看您的magic_quotes 设置,并在您的服务器上进行比较。您的家庭服务器可能禁用了magic_quotes(因为它们应该是,因为在当前版本的PHP 中Magic Quotes is deprecated),并且您的网络主机可能启用了它们(可悲的是,这很常见)。您可以使用:

    <?php echo phpinfo(); ?>
    

    进行快速比较。

    如果你不熟悉magic_quotes,那么在部署你关心的任何东西之前,你可能想多了解一下PHP的安全性。

    Questions containing "magic_quotes"

    【讨论】:

      【解决方案5】:

      您的主机可能启用了Magic Quotes

      【讨论】:

        【解决方案6】:

        看看magic_quotes_gpc。您可以通过 .htaccess 将其关闭并使用 mysql_real_escape_string()。

        【讨论】:

          【解决方案7】:

          真正的解决方案是在插入查询中使用准备好的语句。

          这是一个顶部有插入示例的网站。

          Prepared Statements in PHP

          好处是这是一种最佳实践,副作用是您不再需要担心清理输入以防 SQL 注入攻击。

          【讨论】:

          • 没有。问题在于不需要的额外反斜杠。
          • 是的,但这会阻止它们进入。只需一点代码就可以很容易地在现有数据中清理它们。如果插入操作正确,则问题不会再次出现。
          • 没有。额外的反斜杠是由魔术引号引起的,而不是由 mysql_real_escape_string 引起的。因此,准备好的语句不会有所作为,因为反斜杠已经被 Magic Quotes 添加了。
          猜你喜欢
          • 2010-12-08
          • 1970-01-01
          • 1970-01-01
          • 2011-11-18
          • 2010-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多