IIS CGI HTTP_PROXYヘッダーリクエストがリダイレクトされる可能性があります。

現象

リクエストをリダイレクトするのに特定のライブラリを使用する、実行可能なプログラムをホストしているIIS Common Gateway Interface (CGI)フィーチャーを使用する際、"PROXY" リクエストヘッダーが存在することによってリクエストが正常に行われない可能性があります。複数のウェブアプリケーションプラットフォームがこのライブラリを使用することが知られています。これにはPHP、Python、Go、そしてその他が含まれます。

原因

CGIはウェブサーバーが実行可能なプロセスとして実行するアプリケーションをホストできるようになるインターフェースです。ウェブサーバーによってリクエストが受信された場合、サーバーはその単一のリクエストを処理するための新しいプロセスを開始します。リクエストが完了したとき、プロセスは終了します。プロセスがリクエストデータへのアクセスを得るために、名前の先頭に"HTTP_"が追加されたリクエストヘッダーが環境変数として含まれています。よって、"Proxy"と名前がつけられたヘッダーを含むリクエストのCGIプロセスは、リクエストヘッダーと同じ値を持つ"HTTP_PROXY"環境変数を含みます。

cURLコマンドラインとライブラリを用いると多くの種類のアプリケーションがウェブサーバーを含む多くの種類のサーバーにリクエストを行うことができるようになるので、一般的に使用されています。ライブラリコマンドラインパラメータ―を使用して構成することができます。またはホストプロセス環境変数から構成パラメーターを読み込むことができます。"HTTP_PROXY"はcURLで使用される多くの構成パラメーターの一つです。"HTTP_PROXY"は構成されたプロキシを通じてHTTPリクエストを送信するために、cURLで使用されます。

注意これはクライアントリクエストヘッダーの表示としての"HTTP_PROXY"とは関連がありません。

CGIプロセス内でcURLがホストされて、そのプロセスが"HTTP_PROXY"と名付けられた環境変数を含む場合、cURLは環境変数によって値が特定されているHTTPプロキシを介してリクエストデータを送信するためにその値を使用します。これはcURLが"HTTP_PROXY"が構成ディレクティブであってクライエントリクエストヘッダーでないと予想することから発生します。

回避策

この問題を回避するには、CGIをIISを実行中のサーバーで使用しないでください。CGIは基本的にobsoleteインターフェースであり、新しくてよりパフォーマンスに直結するインターフェースに代替されます。PHP、Python、そしてGoはIIS上でFastCGIを介してホストしてください。FastCGIはクライアントリクエストヘッダーに環境変数を使用しないので、この問題は発生しません。しかしPHPに関しては、いくつかのアプリケーションが環境変数を検出するためにPHPのgetenv()機能を使用する可能性があります。CGIプロセス内でPHPがホストされてない場合でも、リクエストヘッダー値をgetenv()機能に使用可能なデータセットに注入することでCGIの行動を複製します。HTTP_PROXYをこの方法で検出するPHPを使用する場合、次のヘッダー値のクリアの緩和またはPROXYヘッダーを用いたリクエストの拒否が効果的です。

何らかの理由でCGIを使用しなければならない場合、"Proxy"と名付けられたリクエストヘッダーを含むリクエストをブロックするか、ヘッダーの値をクリアしてください。これは"Proxy"がスタンダードなリクエストヘッダーネームではなく、ブラウザが基本的にそれを送信しないからです。

プロキシヘッダー(望ましいソリューション)を含むリクエストブロックするためには、以下のコマンドラインを実行してください。
appcmd set config /section:requestfiltering /+requestlimits.headerLimits.[header='proxy',sizelimit='0']

注意appcmd.exeは、一般的にはパス内に存在せず%systemroot%\system32\inetsrvディレクトリで発見することができます。

ヘッダーの値をクリアするためには、以下のURLのリライトルールを使用することができます。
<system.webServer>
<rewrite>
<rules>
<rule name="Erase HTTP_PROXY" patternSyntax="Wildcard">
<match url="*.*" />
<serverVariables>
<set name="HTTP_PROXY" value="" />
</serverVariables>
<action type="None" />
</rule>
</rules>
</rewrite>
</system.webServer>

注意URLリライトはIISでダウンロード可能なアドインで、IISインストールのデフォルトには含まれていません。
プロパティ

文書番号:3179800 - 最終更新日: 2016/08/02 - リビジョン: 1

フィードバック