web-dev-qa-db-ja.com

PHP filter_input(INPUT_SERVER、 'REQUEST_METHOD')はnullを返しますか?

この行がライブサーバーでnullを返すのはなぜですか?

filter_input(INPUT_SERVER, 'REQUEST_METHOD');

ライブサーバーはphp5.5.9

私は何かを逃したことがありますか?

以下のグローバルメソッドの代わりに使用すると思いましたか?

$_SERVER['REQUEST_METHOD'];

コードの一部、

public function __construct()
    {
        // Construct other generic data.
        $this->clientRequestMethod = filter_input(INPUT_GET, 'method'); // such as list, add, update, etc
        $this->clientPostMethod = filter_input(INPUT_POST, 'method'); // such as update
        $this->serverRequestMethod = filter_input(INPUT_SERVER, 'REQUEST_METHOD'); //such as get or post
    }


    public function processEntry()
    {

        // Determine the $_SERVER['REQUEST_METHOD'] whether it is post or get.
        if ($this->serverRequestMethod === 'POST' && $this->clientPostMethod != null) 
        {
            $this->processPost();
        }
        else if($this->serverRequestMethod === 'GET' && $this->clientRequestMethod != null) 
        {
            $this->processRequest();
        }
    }
13
laukok

したがって、問題/バグは次のとおりです。

filter_input()INPUT_SERVERまたはINPUT_ENVでは機能しません[〜#〜] fastcgi [〜#〜]

バグは何年も前から知られており、対処されたとは何も言えません。いくつかの回避策を見つけましたが、完全な解決策はありませんでした。そのため、プロジェクト全体の解決策として、このヘルパー関数に最適な回避策を追加しました。ある程度のセキュリティを提供し、列車事故を回避するために、関数はfilter_var()にフォールバックし、filter_input()は失敗します。ネイティブのfilter_input()関数と同じ形式を使用して、プロジェクトに簡単に統合し、バグが修正された場合に将来削除するのを簡単にします。

function filter_input_fix ($type, $variable_name, $filter = FILTER_DEFAULT, $options = NULL )
{
    $checkTypes =[
        INPUT_GET,
        INPUT_POST,
        INPUT_COOKIE
    ];

    if ($options === NULL) {
        // No idea if this should be here or not
        // Maybe someone could let me know if this should be removed?
        $options = FILTER_NULL_ON_FAILURE;
    }

    if (in_array($type, $checkTypes) || filter_has_var($type, $variable_name)) {
        return filter_input($type, $variable_name, $filter, $options);
    } else if ($type == INPUT_SERVER && isset($_SERVER[$variable_name])) {
        return filter_var($_SERVER[$variable_name], $filter, $options);
    } else if ($type == INPUT_ENV && isset($_ENV[$variable_name])) {
        return filter_var($_ENV[$variable_name], $filter, $options);
    } else {
        return NULL;
    }
}

これが最善の解決策のようです。問題を引き起こす可能性のあるエラーが含まれている場合はお知らせください。

15

ライブサーバー(Cent OS 5)ではなくローカルマシン(OSX Mavericks、PHPバージョン5.4.24)で動作していた場合も、同じ問題が発生しました。サーバーを5.3からアップグレードしました。 .9から5.5.15(そして、おそらく無関係ですが、mbおよびmcrypt関数を追加しました)そして今では動作します。

共有ホストを使用している場合、これはおそらく役に立ちませんが、PHP/Apacheを再構築できるかどうかを尋ねることはできます。

5
Svavar

FastCGIは、この関数でINPUT_SERVERおよびINPUT_ENVを使用すると、予期しないnull値を伴う奇妙な副作用を引き起こすようです。このコードを使用して、サーバーに影響するかどうかを確認できます。

安全を確保したい場合は、スーパーグローバルの$ _SERVER変数と$ENV変数を使用すると常に機能します。 Get/Post/Cookieのfilter*関数は問題なく使用できますが、これは重要な部分です。

ソース: http://php.net/manual/es/function.filter-input.php#77307

4
odan

私はXAMPPローカルホストでも同じ問題を抱えていて、狂ったように解決策を探していました。私が最終的に得たのは、FCGIモード(私の場合はFCGI/PHP5.4)でPHPを実行している場合、この関数の既知のPHPバグです)私はこれを通過することを確認しました リンク。

私が使用した回避策はfilter_var($_SERVER['PHP_AUTH_USER'], FILTER_SANITIZE_STRING)ですが、これはfilter_inputの代替ではありません。 filter_inputはより安全です。

4
Supratim Roy

php.iniを次の場所から変更して解決します。

variables_order = "GPCS"

に:

variables_order = "GPCSE"

デフォルトでは、PHPは環境変数を登録していなかったので、この変更により環境変数が有効になりました。興味深いのは、INPUT_SERVER変数も機能するようになったことです。

たった2つの追加情報、私はPHP 7.0.13を使用しており、他の回答で述べたように、この問題は PHPバグ に関連しています。

別のオプションは、以下を使用することです。

filter_var(getenv('REQUEST_METHOD'));
4