我使用PHP邮寄表单输入。
我应该这样做:
$_POST['whatever'] = function_to_remove_control_characters($_POST['whatever']);
或
$whatever = function_to_remove_control_characters($_POST['whatever']);
在我的剧本开头?
为什么?
(在输入通过邮件发送或输出到HTML之前,我进一步过滤和/或转义。)
答案 0 :(得分:6)
重要的是要记住,字符串中没有“逃避一切”,不同的上下文需要不同的转义。因此,转义用于SQL的字符串的函数与转义它以在HTML中使用或在电子邮件正文中使用的函数不同。
因此,您的转义应该尽可能晚地发生,其中您使用文本用于特定目的,而不是在您收到用户的输入后立即。同样,您不希望在应用了不同的转义时覆盖相同的变量 - 例如,您可能希望在HTML模板和纯文本电子邮件中使用它,因此需要在一个中应用htmlspecialchars()
地方,而不是其他。
这导致第二种方法,使用局部变量,是更好的方法,因为覆盖$_POST
意味着对用户的输入进行全局更改,这在代码的其他地方可能不合适。
在某些情况下,您可能需要进行清理(例如修剪空格,剥离而不是转义禁用的字符),然后在多个上下文中使用,但如果使用新变量执行此操作,它仍然是最清晰的,因此您可以跟踪哪个已应用更改。这样,$_POST
始终代表用户实际提交的内容,而不是您希望他们提交的内容。
答案 1 :(得分:1)
两者都不会产生错误两者都没问题。但第二个更清楚。
$_POST
是supergrobal数组,其值从POST请求中解析。可以分配它可以覆盖它可以清理。只是简单的数组。您不会修改POST请求数据,但是您将覆盖数组中的值。