将$ _POST清除为$ _POST或作为另一个变量

时间:2015-04-28 10:21:56

标签: php security post

我使用PHP邮寄表单输入。

我应该这样做:

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

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

在我的剧本开头?

为什么?

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

2 个答案:

答案 0 :(得分:6)

重要的是要记住,字符串中没有“逃避一切”,不同的上下文需要不同的转义。因此,转义用于SQL的字符串的函数与转义它以在HTML中使用或在电子邮件正文中使用的函数不同。

因此,您的转义应该尽可能晚地发生,其中您使用文本用于特定目的,而不是在您收到用户的输入后立即。同样,您不希望在应用了不同的转义时覆盖相同的变量 - 例如,您可能希望在HTML模板和纯文本电子邮件中使用它,因此需要在一个中应用htmlspecialchars()地方,而不是其他。

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

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

答案 1 :(得分:1)

两者都不会产生错误两者都没问题。但第二个更清楚。

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