return

環境変数のお話


目次


はじめに

 クライアント(ブラウザ)がCGIを呼び出したした場合、サーバーは、各種の環境変数を設定してからこのCGIを起動します。この環境変数には、クライアントがサーバーにリクエストした際の情報に基づくものや、サーバー自身の情報などがあります。
 そして、CGIがこれらの環境変数を調べることにより、訪問者に関する情報やプロキシサーバー経由かどうかなどを知ることができる可能性があります。

 あなたがここのサーバーのCGIを起動した場合に設定される環境変数は、「ここ」をクリックしてご覧ください。

 なお、この環境変数表示用 perl script のソースも公開しておきます。
ファイル使用方法FTPパーミッション
env.txtenv.cgi に名称変更ASCII転送755
 第1行目のperlのパスは、設置環境に合わせて変更してください。
 このスクリプトは、PDS扱い(無断使用改造配布自由)ということで好き勝手にご利用ください。
 ただし、元のものは他のCGIとの連携のための小細工とかがあるんで、公開したものは不要なコードを削除して少し変えてあります(実際の実行イメージはこちら)。また、ネットスケープ用には、環境変数表示の最後にJavaのオマケも付けておきました。

 

プロキシサーバーを経由しない場合

 まず、ここ をクリックしてプロキシサーバーを経由しない場合の環境変数を見てください。この環境変数は、「TOOLS」のページで「getenv.html」から「getenv.cgi」を介して「env.cgi」を呼び出した場合に設定される全環境変数を表示したものです。「getenv.cgi」は、NNのリクエストヘッダを模したWebクライアントなので、あなたの環境とは多少違うでしょうが、以降も、この「getenv.cgi」を用いて予め取得した環境変数を例示しますので、比較のために見ておいてください。

 「env.cgi」は、環境変数を3種類に色分けします。ここでは、REMOTE と HTTP で始まる環境変数が重要になるので、REMOTE で始まる環境変数は赤色背景で表示し、HTTP で始まる環境変数は緑色背景で表示しています。なお、黄色背景で表示した環境変数は、主にサーバー自身に関する情報であり、プロキシサーバーとはほとんど関係ありません。 (悪戯防止関係では、REQUEST_METHOD にも注意する必要はありますが…)


 
 REMOTE で始まる環境変数は、CGI を呼び出したクライアントに関する情報であり、もっとも重要なものとなります。



 
 HTTP で始まる環境変数は、クライアントが CGI を呼び出す際のHTTPリクエスト・ヘッダの一部がそのまま設定されます。
 リクエスト・ヘッダとレスポンス・ヘッダについては、「TOOLS」のページの「get.html」を参照してください。また、リクエスト・ヘッダを変えた場合に、環境変数にどのように反映されるかについては、「getenv.html」を参照してください。


 ここで表示された他の環境変数は、ブラウザなどに応じていろいろ変化するものであり、特に重要ではありません。この例では HTTP_USER_AGENT 以外にも NN4 が送るリクエスト・ヘッダを模していますが、IE などではまた違った環境変数が設定されます(クライアントの端末の情報など)。

 プロキシサーバー経由の場合には、後に説明するように、この HTTP で始まる環境変数が最も重要なものとなります。

 ここで注意して頂きたいのは、HTTP で始まる環境変数はあくまでもクライアントから送られてくるリクエスト・ヘッダに基づいてサーバーがそのまま設定するものであるため、この情報を無条件に信頼することはできないということです。たとえば、「なりきりブラウザ」のように、既存のブラウザが送り出す HTTP_USER_AGENT の内容を自由に書き替えることができるようにするものもあります。また、「getenv.html」が呼び出す「getenv.cgi」も、クライアントとして任意のリクエスト・ヘッダにより「env.cgi」を呼び出すことができます。ここで、Referer: ヘッダや User-Agent: ヘッダなどの内容を書き換えて、これが HTTP_REFERERHTTP_USER_AGENT などに反映されることを確認してみてください。つまり、自作のクライアントであれば、これらのリクエスト・ヘッダは、好きに変更することが可能になる訳です。そして、このようなクライアントは、perl などによる CGI 以外にも、Java や VB などを用いれば比較的容易に作成可能なものなのです(最近、perl や java を用いたネットワーク・プログラミングの本も多くなって来ています)。
 ちなみに、「getenv.html」や「getenvp.html」が呼び出す「getenv.cgi」は、クライアントとして GET METHOD により「env.cgi」を呼び出すだけの CGI ですが、これを POST METHOD により QUERY 文字列を伴い任意の URL を呼び出すことができるようにしたものが PerlDUCK であり、掲示板アタック兵器として有名な PerlDUKE も基本的にはそのようなものであると思われます。また、ガブリエル(Gabriel)についてはよく分からないんですが、ガブリエナイ(Gabrienai)は、パソコン上などで実行する Java のアプリケーションによるクライアント(サーバー機能もあるローカル串)です。これらは、もともとは HTTP_REFERER を書き換えて、掲示板などに外部から書き込みできるようにすることを目的に作られたもののようですが、今では他のリクエスト・ヘッダも自由に書き換えて、経由するプロキシサーバーも簡単に多段にしたり切り替える機能があるようです。


 

プロキシサーバー経由の場合


 プロキシサーバーと環境変数との関係について簡単に説明します。