この行がライブサーバーで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();
}
}
したがって、問題/バグは次のとおりです。
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;
}
}
これが最善の解決策のようです。問題を引き起こす可能性のあるエラーが含まれている場合はお知らせください。
ライブサーバー(Cent OS 5)ではなくローカルマシン(OSX Mavericks、PHPバージョン5.4.24)で動作していた場合も、同じ問題が発生しました。サーバーを5.3からアップグレードしました。 .9から5.5.15(そして、おそらく無関係ですが、mbおよびmcrypt関数を追加しました)そして今では動作します。
共有ホストを使用している場合、これはおそらく役に立ちませんが、PHP/Apacheを再構築できるかどうかを尋ねることはできます。
FastCGIは、この関数でINPUT_SERVERおよびINPUT_ENVを使用すると、予期しないnull値を伴う奇妙な副作用を引き起こすようです。このコードを使用して、サーバーに影響するかどうかを確認できます。
安全を確保したい場合は、スーパーグローバルの$ _SERVER変数と$ENV変数を使用すると常に機能します。 Get/Post/Cookieのfilter*関数は問題なく使用できますが、これは重要な部分です。
ソース: http://php.net/manual/es/function.filter-input.php#77307
私はXAMPPローカルホストでも同じ問題を抱えていて、狂ったように解決策を探していました。私が最終的に得たのは、FCGIモード(私の場合はFCGI/PHP5.4)でPHPを実行している場合、この関数の既知のPHPバグです)私はこれを通過することを確認しました リンク。
私が使用した回避策はfilter_var($_SERVER['PHP_AUTH_USER'], FILTER_SANITIZE_STRING)
ですが、これはfilter_input
の代替ではありません。 filter_input
はより安全です。
php.ini
を次の場所から変更して解決します。
variables_order = "GPCS"
に:
variables_order = "GPCSE"
デフォルトでは、PHPは環境変数を登録していなかったので、この変更により環境変数が有効になりました。興味深いのは、INPUT_SERVER
変数も機能するようになったことです。
たった2つの追加情報、私はPHP 7.0.13を使用しており、他の回答で述べたように、この問題は PHPバグ に関連しています。
別のオプションは、以下を使用することです。
filter_var(getenv('REQUEST_METHOD'));