Netbeans 7.4 for PHP中的警告“不要直接访问超全局变量$ _POST数组”

122

我在使用 $_POST $_GET $_SERVER 等时,在 Netbeans 7.4 for PHP 上收到了这个警告信息:

不要直接访问超全局变量 $_POST 数组

这是什么意思?我该如何纠正这个警告?

编辑:事件示例代码仍显示此警告。


1
Netbeans中保证此消息的代码是什么? - TiMESPLiNTER
2
这只是一个建议,你可以在选项中关闭它... 我会说这不是一个编程问题! - Matteo Tassinari
1
我只想知道这个警告想让我改变什么!因为旧版本的NetBeans没有显示。还有其他方法可以获取这些参数吗?(我的意思是$_POST) - Kannika
@MatteoTassinari 我知道这只是建议,我也知道如何禁用它,但我该怎么做才能在没有任何警告的情况下正确地完成呢?我认为我的知识有限,无法获得警告,但我只是想修复它,使我的代码与新事物保持最新状态,因为我知道只有 $_POST 才会获取那些提交的表单。无论如何,感谢您的评论:D - Kannika
1
可能是直接访问PHP超全局变量的安全问题的重复问题。 - Ankur
5个回答

100

filter_input(INPUT_POST, 'var_name') 可以替代 $_POST['var_name']
filter_input_array(INPUT_POST) 可以替代 $_POST


7
你是在回答“这个警告的意思是什么”还是“如何移除它”的问题?因为我同意你所说的,那就是这个警告的意思,但是使用这个函数,警告仍然存在。我现在正在使用$name = filter_input(INPUT_POST, $_POST["name"]);代码时遇到了这个警告。 - stenci
6
@stenci,你在使用 $_POST,而你应该像这样做:$name = filter_input(INPUT_POST, "name"); - Wojciech Sobczyk
16
警告可能会消失,但如果您不指定过滤器,则无法真正修复NetBeans指出的安全问题。例如,如果您期望输入整数,请使用:filter_input(INPUT_POST,'var_name',FILTER_SANITIZE_NUMBER_INT) - HoffZ
51
这个回答似乎有些琐碎。没有解释filter_input的功能,也没有链接到http://www.php.net/filter_input。让人担心的是,人们可能只是看到了它,使用了它,认为他们写出了更好的代码,但仍然一无所知。 - IARI
5
建议使用没有筛选参数的过滤器函数会导致FILTER_UNSAFE_RAW,这等同于TRUST_ALL_BAD_INPUT,需注意。 - Kzqai
显示剩余7条评论

96
尽管有点晚,我在寻找解决同样问题的方法时发现了这个问题,所以希望它能有所帮助...
我也遇到了和你一样的问题。刚刚发现了这篇文章,其中介绍了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和filters文档:

http://www.php.net/manual/en/function.filter-input.php

http://www.php.net/manual/en/filter.filters.php


如果您按照所说的做,Netbeans仍会在"$_POST"或"$_GET"部分下划线,并显示通知,就好像它没有被过滤一样。这个问题可能只是Netbeans的一个bug(至少在8.1版本中)。 - user3640967
使用filter_input替换它。不要与它一起使用。 - user2924019

8

我同意其他回答者的观点,在大多数情况下(几乎总是)需要对您的输入进行清理。

但考虑以下代码(这是用于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();
}

在这里应用过滤并不是非常有用的(虽然它也不会破坏任何东西)。

因此,要遵循建议,但不要盲目跟从 - 而是要理解为什么要这样做 :)


3

只需要使用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);

注意:适用于所有其他超全局变量。

请问,如果要替代 if(isset($_POST) && !empty($_POST)) { //一些代码 } 的话,有什么可行的方法吗? - Asmat Ali

3

这是我代码中的一部分,它在NetBeans中引发了警告:

$page = (!empty($_GET['p'])) 

经过大量研究和发现有无数种方法可以过滤这个数组,我找到了一种简单的方法。我的代码能够正常工作,NetBeans也很开心:

$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接