在Netbeans 7.4 for PHP上警告"不要直接访问Superglobal $ _POST数组"

Kan*_*ika 116 php netbeans superglobals netbeans-7.4

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

不要直接访问Superglobal $ _POST数组

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

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

小智 91

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

  • -1:这个答案似乎有点微不足道.没有解释,filter_input是什么,甚至没有到http://www.php.net/filter_input的链接.让我感到害怕的是,人们只会看到它,使用它,认为它们正在编写更好的代码,但仍然无法理解. (41认同)
  • 好吧,警告可能会消失,但如果您没有指定过滤器,那么您将无法真正解决NetBeans指出的安全问题.例如,如果您期望int,请使用:`filter_input(INPUT_POST,'var_name',FILTER_SANITIZE_NUMBER_INT)` (15认同)
  • 您是在回答"警告意味着什么"或者"如何删除它"的问题?因为我同意你的看法,这就是警告意味着什么,但是使用这个功能警告就在那里.我现在在`$ name = filter_input(INPUT_POST,$ _POST ["name"]);`. (6认同)
  • @stenci你再次使用$ _POST而你应该做这样的事情$ name = filter_input(INPUT_POST,"name"); (6认同)
  • Ow,建议使用不带过滤器参数的过滤器函数会导致FILTER_UNSAFE_RAW,这相当于TRUST_ALL_BAD_INPUT (4认同)
  • 您必须指定一个过滤器,否则除了消除警告之外,这不会做任何事情。手册说:“如果省略,将使用 FILTER_DEFAULT,相当于 FILTER_UNSAFE_RAW。这将导致默认情况下不进行过滤。” (2认同)

小智 85

虽然有点晚,我在搜索同一问题的解决方案时遇到了这个问题,所以我希望它可以有任何帮助......

发现自己处于与你相同的黑暗中.刚刚发现这篇文章,它解释了NetBeans 7.4中引入的一些新提示,包括以下内容:

https://blogs.oracle.com/netbeansphp/entry/improve_your_code_with_new

添加它的原因是因为超级全局通常充满了用户输入,这不应该被盲目信任.相反,应该进行某种过滤,这就是暗示所暗示的.过滤超全球值,以防它有一些中毒内容.

例如,我在哪里:

$_SERVER['SERVER_NAME']
Run Code Online (Sandbox Code Playgroud)

我改为:

filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)
Run Code Online (Sandbox Code Playgroud)

您在此处拥有filter_input和filters doc:

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

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


Rau*_*ets 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();
}
Run Code Online (Sandbox Code Playgroud)

在这里应用消毒并不是非常有用(尽管它也不会破坏任何东西).

所以,请遵循建议,但不要盲目 - 而要理解他们为什么这样做:)