Netbeans 7.4 for PHPでの警告 "スーパーグローバル$_POST配列に直接アクセスしないでください"。

Netbeans 7.4 for PHPで、$_POST, $_GET, $_SERVER, ...を使用しているときに、このメッセージの警告が表示されました。

スーパーグローバルな$_POST配列に直接アクセスしないでください。

この警告はどういう意味ですか?この警告を修正するにはどうしたらよいですか?

Edit: Eventのサンプルコードでは、まだこの警告が表示されています。

質問へのコメント (5)
ソリューション

$_POST['var_name']の代わりにfilter_input(INPUT_POST, 'var_name')<br/> $_POST の代わりに filter_input_array(INPUT_POST) とする。

解説 (12)

遅ればせながら、同じ問題の解決策を検索していたらこの質問に行き着きましたので、少しでも参考になればと思います...。

私もあなたと同じような状況に陥っています。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

解説 (1)

他の回答者と同意見で、ほとんどの場合(ほとんど常に)、入力のサニタイズが必要です。

しかし、このようなコード(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();
}

ここでサニタイズを適用しても、あまり意味がありません (ただし、何も壊れません)。

ですから、推奨事項には従いましょう。ただし、やみくもに従うのではなく、なぜそうするのかを理解してください :)

解説 (0)

使用するだけ。

$ _INPUT_METHOD_NAME ['var_name']の代わりにfilter_input(INPUT_METHOD_NAME、 'var_name')。 $ _INPUT_METHOD_NAMEの代わりにfilter_input_array(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);

N.B:他のすべてのスーパーグローバル変数に適用します。

解説 (0)