TL; DR-修正(必要ない場合もあります)は非常に簡単で、この回答の最後にあります。
特定の質問に対処しようとしますが、PATH_INFOが何であるかを誤解すると、質問自体が少し間違っています。
最初の質問は、「このパス情報ビジネスとは何ですか?」
次の質問は、「PHPはどのように何PATH_INFO
を決定SCRIPT_FILENAME
するのですか?」
- PHPの以前のバージョンでは、ナイーブだった、技術的にもサポートしていませんでした
PATH_INFO
どのようなことになったので、PATH_INFO
上にマングドたSCRIPT_FILENAME
その、はい、多くの場合、壊れています。テストするのに十分な古いバージョンのPHPはありませんがSCRIPT_FILENAME
、上記の例の「/path/to/script.php/THIS/IS/PATH/INFO」(接頭辞付き)通常どおりdocroot)。
- cgi.fix_pathinfoを有効にすると、PHPは上記の例の「/ THIS / IS / PATH / INFO」を正しく検出し、要求されているスクリプト(もちろんdocrootで始まる)を指す部分だけ
PATH_INFO
をSCRIPT_FILENAME
取得します。
- 注:PHPが実際にサポート
PATH_INFO
するようになると、古い動作に依存するスクリプトを実行している人が新しいバージョンのPHPを実行できるように、新しい機能の構成設定を追加する必要がありました。そのため、構成スイッチさえあります。最初からビルトインされている必要があります(「危険な」動作)。
しかし、PHPは、スクリプトの一部とパス情報をどのように認識しますか?URIが次のような場合:
http://example.com/path/to/script.php/THIS/IS/PATH/INFO.php?q=foo
- 環境によっては複雑な質問になる場合があります。PHPで起こることは、サーバーのdocrootの下にあるものに対応しないURIパスの最初の部分を見つけることです。この例では、サーバーに「/docroot/path/to/script.php/THIS」がないことがわかりますが、「/ docroot / path / to / script.php」があるので、
SCRIPT_FILENAME
決定されPATH_INFO
、残りを取得します。
- したがって、NginxのドキュメントとHrvojeŠpoljarの回答(このような明確な例に夢中になることはできません)で詳しく説明されている危険の良い例は、さらに明確になります:Hrvojeの例( " http:// example。 com / foo.jpg / nonexistent.php ")、PHPはdocroot" /foo.jpg "上のファイルを参照しますが、" / foo.jpg / nonexistent.php "と呼ばれるものは表示しないため
SCRIPT_FILENAME
、" / foo.jpg "を取得します(これもdocrootでPATH_INFO
始まります)、「/ nonexistent.php」を取得します。
なぜ、どのように危険なのかが明確になったはずです。
- Webサーバーは実際に障害ではありません。単にURIをPHPにプロキシしているだけです。PHPは「foo.jpg」に実際にPHPコンテンツが含まれていることを無邪気に検出するので、実行します(これで、pwned!)これは、Nginx自体に固有のものではありません。
- REAL問題は、あなたが信頼できないコンテンツが消毒せずにどこかにアップロードすると、あなたはそれができるPHPは喜んで実行し、同じ場所に他の任意の要求を許可しましょうということです。
NginxとApacheは、このトリックを使用してリクエストを防ぐように構築または構成することができ、user2372674の回答を含む、その方法の例がたくさんあります。このブログ記事では問題をうまく説明していますが、正しい解決策がありません。
ただし、最良の解決策は、PHP-FPMが正しく構成されていることを確認して、「。php」で終了しない限りファイルが実行されないようにすることです。PHP-FPMの最近のバージョン(〜5.3.9 +?)はこれをデフォルトとして持っているので、この危険はもはやそれほど問題ではないことに注意する価値があります。
ソリューション
PHP-FPMの最新バージョン(〜5.3.9 +?)を使用している場合は、以下の安全な動作が既にデフォルトであるため、何もする必要はありません。
そうでない場合は、php-fpmのwww.conf
ファイルを検索します(/etc/php-fpm.d/www.conf
システムによって異なります)。これがあることを確認してください:
security.limit_extensions = .php
繰り返しますが、これは最近の多くの場所でデフォルトになっています。
これは、攻撃者が「.php」ファイルをWordPressのアップロードフォルダーにアップロードし、同じ手法を使用して実行することを妨げないことに注意してください。あなたはまだあなたのアプリケーションのために良いセキュリティを持っている必要があります。