我在 Netbeans 7.4 for PHP 上收到此消息警告,而我使用的是 $_POST、$_GET、$_SERVER 美元......
不要直接访问超全局 $_POST 数组
什么意思?如何更正此警告?
编辑:事件示例代码仍显示此警告。
filter_input(INPUT_POST, 'var_name')
而不是$_POST['var_name']
filter_input_array(INPUT_POST)
而不是$_POST
虽然有点晚了,但我在寻找相同问题的解决方案时遇到了这个问题,所以我希望它能有所帮助......
发现自己和你一样在黑暗中。刚刚找到了这篇文章,其中解释了 NetBeans 7.4 中引入的一些新提示,包括这个:
https://blogs.oracle.com/netbeansphp/entry/improve_your_code_with_new
之所以添加它,是因为超全局变量通常充满了用户输入,而用户输入永远不应该被盲目信任。相反,应该进行某种过滤,这就是提示所暗示的。过滤超全局值,以防它有一些中毒内容。
例如,我有:
$_SERVER['SERVER_NAME']
我把:
filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)
您在此处查看filter_input和过滤器文档:
http://www.php.net/manual/en/function.filter-input.php
http://www.php.net/manual/en/filter.filters.php
我同意其他回答者的观点,即在大多数情况下(几乎总是)有必要对您的输入进行消毒。
但是考虑这样的代码(它是针对 REST 控制器的):
$method = $_SERVER['REQUEST_METHOD'];
switch ($method) {
case 'GET':
return $this->doGet($request, $object);
case 'POST':
return $this->doPost($request, $object);
case 'PUT':
return $this->doPut($request, $object);
case 'DELETE':
return $this->doDelete($request, $object);
default:
return $this->onBadRequest();
}
在这里应用消毒不是很有用(尽管它也不会破坏任何东西)。
因此,遵循建议,但不要盲目 - 而是了解为什么它们是:)
只需使用
filter_input(INPUT_METHOD_NAME, 'var_name')
而不是$_INPUT_METHOD_NAME['var_name']
filter_input_array(INPUT_METHOD_NAME)
而不是$_INPUT_METHOD_NAME
例如
$host= filter_input(INPUT_SERVER, 'HTTP_HOST');
echo $host;
而不是
$host= $_SERVER['HTTP_HOST'];
echo $host;
并使用
var_dump(filter_input_array(INPUT_SERVER));
而不是
var_dump($_SERVER);
注意:应用于所有其他超全局变量
下面是我的代码中在 NetBeans 中引发警告的一行的一部分:
$page = (!empty($_GET['p']))
经过大量研究,并看到有无数种方法来过滤这个数组,我发现了一个很简单的方法。我的代码可以工作,NetBeans 很高兴:
$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))