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

时间:2017-08-17 10:36:20

标签: php post filter request superglobals

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

filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

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

试验:

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

// 2.
$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
var_dump($_POST);
?>

输出:

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

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

index.php:8:null

所以一定要放

$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING, true);

在您脚本的顶部上!

问:有没有人注意到这种行为 - 或者我在推理中犯了错误?

可能的答案:数据来自超级全球 $ _ REQUEST ,而不是来自 $ _ POST

2 个答案:

答案 0 :(得分:2)

$ _POST和INPUT_POST之间没有直接连接。

后者仅指定filter_input_vars应该从最初用于填充$ _POST的相同源中获取数据。稍后操作$ _POST不会改变最初发送给脚本的POST数据。

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

http://php.net/manual/en/filter.constants.php将INPUT_POST描述为“POST变量”,并且指向$ _POST的描述的链接可能会有点误导,授予。但公平地说,在那里说 POST,而不是$ _POST。

  

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

我不会那么推荐。每个PHP开发人员都会认为$ _POST包含未过滤的数据。你一旦f.e.开始使用第三方模块,这可能会导致麻烦。

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

答案 1 :(得分:1)

在执行该功能并将其分配给$_POST后,您的变量null包含$_POST。从PHP Manual可以返回null,因为没有定义函数应该工作的资源。

我相信您应该调查变量的完整性或使用该函数。