PHP:INPUT_POST(在filter_input_array中使用)覆盖$_POST之前的所有修改

Rob*_*Sim 6 php post request filter superglobals

PHP 过滤器函数filter_input_array()的INPUT_POST参数,例如

filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
Run Code Online (Sandbox Code Playgroud)

似乎会覆盖应用于超全局 $_POST 的任何修改。

测试:

<?php
// 1.
$_POST['abc'] = '123';
var_dump($_POST);

// 2.
$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
var_dump($_POST);
?>
Run Code Online (Sandbox Code Playgroud)

输出:

// 2. 之后你的 $_POST 将为空(因为初始 POST 为空)

index.php:4:
array (size=1)
'abc' => string '123' (length=3)

index.php:8:null
Run Code Online (Sandbox Code Playgroud)

所以请确保,把

$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING, true);
Run Code Online (Sandbox Code Playgroud)

在你的脚本的顶部

问:是否有人也注意到了这种行为——或者我在推理中犯了错误?

可能的答案:数据是从超全局$_REQUEST获取的,而不是从$_POST获取的

CBr*_*roe 8

$_POST 和 INPUT_POST 之间没有直接联系。

\n\n

后者仅指定 filter_input_vars 应从最初用于填充 $_POST 的同一源获取要过滤的数据。稍后对 $_POST 的操作不会更改最初发送到脚本的 POST 数据。

\n\n

您可以通过设置一个小表单来轻松验证这一点,该表单将隐藏的输入字段发布到您的脚本中。然后向该脚本中的 $_POST 添加一个附加条目,就像您在上面的示例中所做的那样。您将看到filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING)返回一个包含隐藏字段条目的数组,但不包含您手动添加到 $_POST 的条目。

\n\n

http://php.net/manual/en/filter.constants.php将 INPUT_POST 描述为 \xe2\x80\x9cPOST 变量\xe2\x80\x9d 并链接到 $_POST 的描述可能有点误导,的确。但公平地说,它在那里显示POST,而不是 $_POST。

\n\n
\n

所以一定要把 \n $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING, true);\n 放在脚本的顶部!

\n
\n\n

我真的不推荐这样做。每个 PHP 开发人员都会假设 $_POST 包含未过滤的数据。一旦您开始使用第三方模块,这可能会导致麻烦。

\n\n

恕我直言,保留 $_POST 不变,并使用单独的变量来保存过滤后的 POST 参数,是更好的方法。

\n


小智 2

在该函数执行并分配给 后,您的变量$_POST包含。根据PHP 手册,可能会返回,因为该函数应该工作的资源未定义。null$_POSTnull

我认为您应该调查变量的完整性或该函数的使用情况。