在Netbeans 7.4 for PHP上警告“不要直接访问Superglobal $ _POST阵列”


118

当我使用$ _POST$ _GET$ _SERVER,...时,在Netbeans 7.4 for PHP上收到此消息警告。

不要直接访问Superglobal $ _POST数组

这是什么意思?我该怎么做才能纠正此警告?

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


1
在Netbeans中确保此消息的代码是什么?
TiMESPLiNTER

2
这只是一个建议,您可以在选项中将其关闭...我想说这不是编程问题!
Matteo Tassinari

1
我只想知道此警告要我更改什么!因为未显示较旧的netbeans版本。还有另一种方法来获取这些参数吗?(我的意思是$ _POST)
坎尼卡,2013年

@MatteoTassinari我知道这只是建议,而且我知道在哪里禁用它,但是在没有任何警告的情况下我该怎么做才能正确无误?我认为我的知识有收到警告的限制,但是我只想解决问题以使我的代码与新事物保持最新,因为我知道只有$ _POST才能提交那些发布表单。无论如何,谢谢您的评论:D
Kannika

Answers:


92

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


6
您是在回答“警告是什么意思”问题还是在“如何删除警告”问题上回答?因为我同意您的意见,所以这就是警告的意思,但是使用此功能,警告就一直存在。我现在有一个$name = filter_input(INPUT_POST, $_POST["name"]);
stenci 2013年

6
@stenci,您将再次使用$ _POST,同时应执行类似以下操作:$ name = filter_input(INPUT_POST,“ name”);
Wojciech Sobczyk

16
好的,警告可能会消失,但是如果您不指定过滤器,那么您将无法真正解决NetBeans指出的安全问题。例如,如果您期望一个整数,请使用:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
HoffZ 2014年

44
-1:这个答案似乎微不足道。没有任何解释,filter_input的功能,甚至没有php.net/filter_input的链接。让我感到恐惧的是,人们只会看到它,使用它,以为他们在编写更好的代码,但仍然不了解。
IARI

5
糟糕,建议使用不带过滤器参数的过滤器功能会导致FILTER_UNSAFE_RAW,这等效于TRUST_ALL_BAD_INPUT
Kzqai 2015年

88

虽然有点晚,但在寻找相同问题的解决方案时遇到了这个问题,所以希望对您有帮助...

发现自己和您一样处于黑暗中。刚刚找到这篇文章,它解释了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和filter文档:

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

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


如果按照您说的去做,Netbeans仍会在“ $ _POST”或“ $ _GET”部分加下划线,并以未过滤的方式显示通知。此问题可能只是Netbeans错误(至少在8.1版中)。
user3640967 '16

6

我同意其他答复者的观点,即在大多数情况下(几乎始终),有必要对您的输入内容进行清理。

但是考虑这样的代码(它是针对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();
}

在这里进行消毒不是很有用(尽管也不会破坏任何东西)。

因此,请遵循建议,但不要盲目地-而是要了解它们的用途:)


1

只需使用

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);

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


0

这是我的代码的一部分,在NetBeans中提出了警告:

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

经过大量研究,并看到有无数种方法可以过滤此数组,我发现了一个简单的方法。我的代码工作正常,NetBeans很高兴:

$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.