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


118

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

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

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

編集:イベントサンプルコードはまだこの警告を示しています。


1
Netbeansでこのメッセージを保証するコードは何ですか?
TiMESPLiNTER 2013年

2
これは単なる推奨事項であり、オプションでオフにすることができます。これはプログラミングの問題ではないと思います。
Matteo Tassinari 2013年

1
この警告が私に何を変えて欲しいのか知りたいだけです!古いnetbeansバージョンが表示されていないためです。これらのパラメーターを取得する別の方法はありますか?(
つまり、

@MatteoTassinari私はそれが単なる推奨であり、どこで無効にするか知っていますが、警告なしに修正するにはどうすればよいですか?私の知識は警告を受け取るには限界があると思いますが、$ _ POSTだけがそれらの投稿フォームを送信することがわかっているので、コードを新しいもので最新のものにするためにそれを修正したいだけです。とにかく、コメントをありがとう:D
Kannika

回答:


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 2013

16
まあ、警告は消えるかもしれませんが、フィルタを指定しないと、NetBeansが指摘しているセキュリティの問題を実際に修正することはできません。あなたがintを期待している場合たとえば、使用:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
HoffZ

44
-1:この答えは簡単なようです。説明はありません。filter_inputが何をするか、php.net/ filter_inputへのリンクもありません。人々はそれを見て、それを使用し、彼らがより良いコードを書いていると思っているが、それでも物事を理解していないのではないかと私は恐れています。
IARI、2015

5
フィルター引数なしでフィルター関数を使用することを提案すると、FILTER_UNSAFE_RAWが発生します。これは、TRUST_ALL_BAD_INPUT
Kzqai

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と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では)。
user3640967

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

使うだけ

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

注意:他のすべてのスーパーグローバル変数に適用します


0

これは、NetBeansで警告を発生させた私のコードの行の一部です。

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

多くの調査を行い、この配列をフィルター処理するための方法が何億にもあることを確認した後、簡単な方法を見つけました。そして私のコードは機能し、NetBeansは満足しています:

$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.