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获取的
$_POST 和 INPUT_POST 之间没有直接联系。
\n\n后者仅指定 filter_input_vars 应从最初用于填充 $_POST 的同一源获取要过滤的数据。稍后对 $_POST 的操作不会更改最初发送到脚本的 POST 数据。
\n\n您可以通过设置一个小表单来轻松验证这一点,该表单将隐藏的输入字段发布到您的脚本中。然后向该脚本中的 $_POST 添加一个附加条目,就像您在上面的示例中所做的那样。您将看到filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING)返回一个包含隐藏字段条目的数组,但不包含您手动添加到 $_POST 的条目。
http://php.net/manual/en/filter.constants.php将 INPUT_POST 描述为 \xe2\x80\x9cPOST 变量\xe2\x80\x9d 并链接到 $_POST 的描述可能有点误导,的确。但公平地说,它在那里显示POST,而不是 $_POST。
\n\n\n\n\n所以一定要把 \n
\n$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING, true);\n 放在脚本的顶部!
我真的不推荐这样做。每个 PHP 开发人员都会假设 $_POST 包含未过滤的数据。一旦您开始使用第三方模块,这可能会导致麻烦。
\n\n恕我直言,保留 $_POST 不变,并使用单独的变量来保存过滤后的 POST 参数,是更好的方法。
\n