【问题标题】:Warning "Do not Access Superglobal $_POST Array Directly" on Netbeans 7.4 for PHP警告“不要直接访问超全局 $_POST 数组”在 Netbeans 7.4 for PHP
【发布时间】:2013-11-15 01:57:47
【问题描述】:

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

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

这是什么意思?我可以做些什么来纠正这个警告?

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

【问题讨论】:

  • 在 Netbeans 中确保此消息的代码是什么?
  • 这只是一个建议,您可以在选项中将其关闭...我会说这不是编程问题!
  • 我只是想知道这个警告要我改变什么!因为旧的 netbeans 版本没有显示。还有其他方法可以从中获取这些参数吗? (我的意思是 $_POST)
  • @MatteoTassinari 我知道这只是建议,我知道在哪里禁用它,但我能做些什么来纠正没有任何警告?我认为我的知识有限,无法获得警告,但我只想修复它以使我的代码与新事物保持同步,因为我知道只有 $_POST 会提交那些发布表单。无论如何,感谢您的评论:D

标签: php netbeans superglobals netbeans-7.4


【解决方案1】:

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

【讨论】:

  • 您是回答“警告是什么意思”的问题还是回答“如何删除它”的问题?因为我同意你的观点,所以这就是警告的意思,但是使用该功能,警告仍然存在。我现在在$name = filter_input(INPUT_POST, $_POST["name"]); 上拥有它。
  • @stenci 您正在再次使用 $_POST 而您应该执行以下操作 $name = filter_input(INPUT_POST, "name");
  • 好吧,警告可能会消失,但是如果您不指定过滤器,那么您将无法真正解决 NetBeans 指出的安全问题。例如,如果您期望一个 int,请使用:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
  • -1:这个答案似乎有点微不足道。没有解释,filter_input 做了什么,甚至没有指向php.net/filter_input 的链接。让我害怕的是人们只会看到它,使用它,认为他们正在编写更好的代码,但仍然不理解。
  • 哦,建议使用不带过滤器参数的过滤器函数会导致 FILTER_UNSAFE_RAW,相当于 TRUST_ALL_BAD_INPUT
【解决方案2】:

虽然有点晚了,但我在寻找相同问题的解决方案时遇到了这个问题,所以我希望它可以提供任何帮助......

发现自己和你一样处于黑暗中。刚刚找到这篇文章,它解释了 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 错误(至少在 8.1 版中)。
  • 将其替换为filter_input。你不要把它和它一起使用。
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

    随便用

    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){ //some code } 的替代方法。
    【解决方案5】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多