【问题标题】:Clean $_POST as $_POST or as a different variable将 $_POST 清理为 $_POST 或作为其他变量
【发布时间】:2015-04-28 10:21:56
【问题描述】:

我正在使用 PHP 邮寄表单输入。

我应该这样做:

$_POST['whatever'] = function_to_remove_control_characters($_POST['whatever']);

$whatever = function_to_remove_control_characters($_POST['whatever']);

在我的脚本开头?

为什么?

(在输入通过邮件发送或输出到 HTML 之前,我正在进一步过滤和/或转义。)

【问题讨论】:

  • 第一个没问题
  • 你不应该像那样操作 $_POST... 分配给变量 $whatever,就像在第二种情况下一样。
  • $whatever = function_to_remove_control_characters($_POST['whatever']);
  • 因为它不安全,可能会导致误解,并且因为超全局变量(自动全局变量)不宜这样处理。将它们用作函数和方法中的变量也有一些限制。 (php.net/manual/en/language.variables.superglobals.php)
  • @Masiorama 我想不出您为什么要将$_POST 用作变量变量的单一原因。但是,我可以想到变量变量永远的合理用途非常少。

标签: php security post


【解决方案1】:

重要的是要记住,字符串中没有“转义所有内容”之类的东西,不同的上下文需要不同的转义。因此,转义字符串以用于 SQL 的功能与转义字符串以用于 HTML 或用于电子邮件正文的功能是不同的。

因此,您应该尽可能晚地进行转义,在这种情况下出于特定目的使用文本,而不是在收到用户输入后立即进行。同样,您不希望应用不同的转义来覆盖相同的变量 - 例如,您可能希望在 HTML 模板和纯文本电子邮件中使用它,因此希望在一个地方应用 htmlspecialchars() 并且不是另一个。

这导致使用局部变量的第二种方法更好,因为覆盖 $_POST 意味着对用户的输入进行全局更改,这可能不适合您代码的其他地方。

在某些情况下,您可能想要清理(例如,修剪空白、去除而不是转义禁用字符)然后在多个上下文中使用,但如果您使用新变量执行此操作仍然是最清楚的,因此您可以跟踪哪个已应用更改。这样,$_POST 始终准确地代表用户实际提交的内容,而不是您希望他们提交的内容。

【讨论】:

  • 谢谢你,@IMSoP。我在这里读到,正如你所说,一个人应该尽可能晚地逃脱,一个人也应该尽早清除控制字符。这是在没有解释的情况下说的(但被多次投票),所以我想实现它。如果原始输入包含那些恶意字符,我看不出我会使用什么(我没有剥离其他任何内容)。你能解释一下吗?
  • @what 嗯,我无法真正回答为什么其他人在没有看到上下文的情况下建议这样做(并且可能会询问他们)。对我来说,实际上并不存在“恶性字符”之类的东西 - 虽然不太可能,但您可能对 POST 二进制数据有一些用处,在这种情况下,您不希望您的自动过滤器弄乱它。
【解决方案2】:

两者都不会产生错误都可以。但第二个更清楚。

$_POST 是一个超级数组,其值从 POST 请求中解析。它可以被分配它可以被覆盖它可以被清理。只是简单的数组。您不会修改 POST 请求数据,但会覆盖数组中的值。

【讨论】:

  • POST请求数据是否保存在别处?
  • 是的,例如在$_REQUEST
猜你喜欢
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2013-12-05
  • 1970-01-01
  • 2018-05-09
相关资源
最近更新 更多