【问题标题】:PHP 5.3 automatically escapes $_GET/$_POST from form strings?PHP 5.3 自动从表单字符串中转义 $_GET/$_POST?
【发布时间】:2011-07-10 18:09:11
【问题描述】:

我的服务器管理员最近升级到 PHP 5.3,我遇到了一个奇怪的“错误”(或 feature,就像 PHP 人所说的那样)。出于明显的安全原因,我的大部分字符串表单数据周围都有mysql_real_escape_string,但现在看来这种转义已经由 PHP 完成了。

<?php

echo $_GET["escaped"];

?>

<form method="get">
    <input type="text" name="escaped" />
</form>

如果我输入例如escape 'this test'escape \'this test\',则此输出。如果我使用 POST 而不是 GET,也是如此。

它是直接与 5.3 升级相关,还是我的管理员在 php.ini 文件中触发了一些自动切换?

另外,我应该保持原样(如果它确实是一个很好的防故障机制,可以正确捕获所有 get 和 post 变量),还是应该禁用它(如果可能的话!)然后返回到mysql_real_escape_string?我的直觉告诉我方法 2 是最好的,但方法 1 会有点自动。 :)

编辑:实际上,我需要禁用它。有时我会收集表单数据并将其重新发送到客户端表单以防出现问题(即缺少字段),因此我不希望他/她突然出现斜线。

【问题讨论】:

  • 另外需要注意的是,如果你的php.ini文件包含语法错误,默认是启用magic_quotes_gpc。因此,如果您认为您在配置文件中禁用了magic_quotes_gpc,则该文件可能包含阻止应用您的配置的错误。个人经验。 :P

标签: php forms escaping magic-quotes


【解决方案1】:

这个“功能”被称为magic_quotes_gpc,它保护您免受所有 SQL 注入攻击(addslashes 在输入超全局变量的每个元素上调用,例如 $_POST 和 @ 987654328@。这忽略了实际的输入/数据库编码)。因此它已被弃用,should not be used.

官方php手册includes a neat way to undo it in php code,但是你应该把它关掉

【讨论】:

  • “简洁”的撤消方法很慢,它是 O(n),不算太糟糕,但仍然会导致大量输入出现问题。
  • @Nicklas A. 这可能很慢,但乍一看,这似乎是撤消魔术引号的最快方法。您能否详细说明如何改进此代码?如果n 是整个 POST 正文的大小,any 算法在其上撤消文本编码将花费 O(n),不是吗?
  • 不,当然没有其他解决方案。我只是说修改 php.ini 是一个更好的解决方案:)
  • 是的,算法是 Ω(n)
  • @Lazlo Bonin 不要忘记之后重新加载 apache。之后,检查 phpinfo 的输出 - 您可能修改了 CLI php.ini 而不是 apache。另外,检查一个简单的 php 脚本 (&lt;?php echo(htmlspecialchars($_POST['x']));)
【解决方案2】:

这是magic quotes造成的,你应该把它关掉。

以下是关闭它的方法:http://www.php.net/manual/en/security.magicquotes.disabling.php

您可以通过 php.ini 或通过从 $_GET$_POST 中的所有变量中删除斜线来实现,显然前者是推荐的方式。


正如 Will Martin 建议的那样,您也可以通过 .htaccess 更改它,如下所示:

php_flag magic_quotes_gpc 关闭

更多信息在这里:http://php.net/manual/en/configuration.changes.php

【讨论】:

  • 当 S/O 允许时将接受。从未想过会存在如此疯狂的“功能”。要求我的管理员禁用它,因为遗憾的是,ini_set 不起作用。 Grr.
  • ini_set 仅适用于脚本被解析后发生的事情,遗憾的是转义发生在之前。魔术语录是邪恶的,只会导致问题,永远不会解决问题。尤其是人们可能会依赖它们来获取东西。
  • 您可以使用 .htaccess 禁用它 - 这发生在页面被解析之前。 php_flag magic_quotes_gpc Off 在您的 .htaccess 中。
【解决方案3】:
【解决方案4】:

听起来你的服务器开启了魔术引号 - 你可以看看 http://www.php.net/manual/en/security.magicquotes.disabling.php 详细讨论禁用它们的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    相关资源
    最近更新 更多