環境変数のお話

Document last Updated: 8.25.1999

[ BACK ]

環境変数ってなに?

そもそも環境変数ってなんなんでしょうか?疑問を抱いている人も多いことと思います。ここでは環境変数について私の解る範囲で説明していこうと思います。

ネットサーフをしているときにあなたのブラウザ(クライアントといいます)がCGIを呼出したとき、環境変数というものが自動的に設定されます。
この、自動的に設定される・・・・と言いましたがむしろ、クライアントと鯖(サーバー)が吐きだしている変数(まぁ、情報みたいなものです)をチェックしていると言ったほうがわかりやすいでしょうか・・・。

[env]←ここで現在あなたに設定されている環境変数を見ることができます。(envとは環境変数という意味ですよ)

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

まず、環境変数の一覧を見ると、REMOTE_ADDR , REMOTE_HOSTという項目があるとおもいます。

REMOTE_ADDR:ここにはアクセス元の IPアドレスが格納されます。この IPアドレスは、IPパケットのIPヘッダから読み出されたもので、つまりあなたがインターネットに接続した際に、接続先のプロバイダなどから振分けられた接続番号のようなもので、いわゆる生IPというやつです。
このIPによって貴方の存在が証明されているわけです。また、このIPというのはパケット自身を書換えない限り勝手に書換えることができない唯一の情報なのです。

REMOTE_HOST:これはIPアドレスのドメインネームが格納されます。このドメインネームというのは、接続先のプロバイダ等の名前が含まれるものです。単にホストとも言います。
簡単に説明すると、REMOTE_ADDRは数字の文字列ですが、REMOTE_HOSTはそれをちゃんとしたホスト名に変換したものなんですね。

インターネット上には様々な掲示板、チャットなどCGIを用いて作られたWEBページがありますが、WEBページの管理人によってはこのIPアドレスをチェックしているようなところも有ります。いわゆるアクセスログを取るというやつなんですが、このようなログを取ることによって万が一悪戯されたときにもそのIPを控えておくと、その悪戯した人のプロバイダ等に問い合せをして犯人を割出すことも出来るのです。場合によってはその悪戯をした人はそのプロバイダから解約されることもあります。
訴えられた本人はたまったものじゃないです。(まぁ、自分が悪いんですが・・・^^;)このお話については[プロキシサーバを経由した場合]でまた取りあげます。

クライアント側の環境変数

次にクライアント(あなた)が吐きだしているその他の環境変数を確認してみましょう。
HTTP_USER_AGENT , HTTP_REFERER , HTTP_CONNECTION , HTTP_ACCEPT
とりあえず、この四つの項目を見てみて下さい。
これらの項目を簡単に説明すると、あなたがどんなOS(例えばウィンドウズとかマッキントッシュとか)を使い、どんな種類のファイルや言語をブラウザが認識できるのか。そしてこのページに一体どこからアクセスしてきたのか、というのが大まかな意味合いです。

HTTP_USER_AGENT:これはあなたが使用しているOSの情報、ブラウザの情報とそのバージョン詳報が格納されます。

Mozilla/4.5 (compatible; MSIE 5.0; Windows 98)

こんな感じで表示されているはずです。

HTTP_REFERER:ここにはあなたがこのページにどこからやってきたのかという情報を格納します。 このHTTP_REFERERをチェックして掲示板などで不正投稿かではないか。というようなセキュリティもかけることができます。

HTTP_CONNECTION:クライアントの接続状況を示す変数です。
通常は Keep-Alive となっています。

HTTP_ACCEPT〜:ここにはブラウザが解釈できるファイルの種類、言語、また、エンコードタイプの情報などが格納されます。

以上、これまで書いてきたものがおおまかなクライアント側の変数です。その他の変数は次以降のコーナーで順に説明していきます。

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

インターネットではプロキシ接続というプロキシサーバを経由しての接続方法があります。
よくプロキシは「インターネット上で荒らしまがいな行為をする人たちがIPを隠すために使用するものだ!」と思われている方々も多いようなのですが、プロキシ接続はそのようなことをするためにするものではありません。
プロキシ接続で便利な機能の一つにプロキシサーバがキャッシュを行うことよって(データを一旦サーバに読込ませてそのあと一気にブラウザに読込む)多少なり快適にブラウジングできるようになります。
もちろん逆の場合もあります。
つまり、プロバイダや様々な接続状況によりそのプロキシサーバへの接続を確立させるまでの経路も違うので同じプロキシサーバであっても誰もが快適に使用できる、といったわけではないのです。

さて、このプロキシサーバに接続してCGIを呼出した場合なんですが、これまた様々な環境変数が設定されます。
この変数にはいろいろなものがあって、プロキシサーバによっては設定されるものが色々なので、このコーナーでは順に説明していきます。プロキシ接続の場合に吐く特殊な環境変数一覧を
[プロキシ接続で吐く特殊な変数]に載せていますので一覧を見られたい方はこちらを参考にしてみて下さい。(あくまで私が知っている限り、ですが...そこんとこだけよろしくね♪)

 ここでは匿名プロキシというものを説明していくのですが、一体その仕組みはどうなっているのでしょうか。プロキシ接続した場合、
REMOTE_ADDR , REMOTE_HOSTには通常、そのプロキシのIP、ドメインが設定されます。
これによりクライアント側の生IPは隠されたことになるわけです。
例えば私の生IPが 125.135.145.155 で、 101.101.101.1 というプロキシサーバに接続したとしましょう。(ここに挙げたIP、プロキシは実物のものではありません)
するとCGIなど、環境変数をチェックする側は普通ならば REMOTE_ADDR には前者が格納されるはずなのですが、後者のプロキシのIPであると解釈します。

REMOTE_ADDR = 101.101.101.1

このような感じに表示されます。

またキャッシュといって目的先のデータを一旦サーバに取込んで一気にブラウザ表示させるという機能があります。そのキャッシュする速度はサーバによって違うのですが、回線が混雑しているときなど、なかなか目的先のデータを読込まないときになど、プロキシサーバにキャッシュさせると意外とすんなり開けることもあります。

 さて、プロキシ接続については私は詳しい知識は持ち合わせていませんのでとりあえず、「こういう機能もあるんだ」ということを断片的にですが説明させていただきました。詳しく勉強されたい方は本を読むなり、プロキシについて詳しく説明してあるWEBサイトなどで学んでくださいね。

 ところでちょっと話はかわるのですが、このプロキシ接続を利用して悪いことをしてしまうひとたちがいます。主に掲示板、チャットなどで中傷、卑猥なことを書いたり、HTMLタグを使って見る人を不機嫌にさせるどころか、タグ等が書かれたものを見たために思わぬ災難(詳しくは述べません)に会わせてしまうというものです。
生IPからの悪戯ならば、悪戯した人のIPをチェックしておいて、その人のプロバイダ等に連絡すれば、いくらか処置を行ってくれます。しかしながら、プロキシ経由の悪戯だと、IPをチェックしたとしても記録されているのはそのプロキシのIPですから、悪戯した本人を特定するのは容易いことではありません。なぜならば、悪戯した張本人を特定するにはまず、そのプロキシサーバの管理人さんに問い合せ、悪戯された時間にそこのプロキシサーバを使った人のなかから、悪戯された掲示板へアクセスしたIPを教えて貰い、(サーバーの管理者はいつそのサーバをどのIPが使用したかわかります)尚かつ、そのIPのプロバイダにも連絡し確認を取らねばなりません。・・・・・とまぁ、こうたやすくいけばまだいいほうです。たいがいはプロキシサーバのアクセス者数が多すぎてとか、プライバシー保守のためにプロキシサーバの管理者もそう簡単には教えてくれません。

 さて.ここで一つ疑問。プロキシ接続してサーバ管理者に問い合せさえされなければ絶対自分の生IPはばれることはないのか?と思いませんか?それは大きな間違えです。プロキシによっては様々な変数を吐きますし、その道のプロの手にかかればアッと言う間に元を調べられて警告のメールが来たり、注文してもないのにピザ屋やらラーメン屋やら寿司屋などからがっさりと出前が届くこともあります。(笑)くれぐれも悪いことはしないようにしましょう。

プロキシ接続でチェックされる変数

この項目ではプロキシ接続によって吐きだす変数について説明します。
プロキシ接続をして環境変数を見てみるとプロキシサーバによっては様々な環境変数の項目が増えます。一般に最も匿名とされるものには、
HTTP_PROXY_CONNECTION = Keep-Alive
HTTP_CACHE_CONTROL = max-stale=xxxx

以外の項目は出ません。

[env]←プロキシ接続してここで環境変数の一覧を見てみると、プロキシ接続によって新たに増えた項目が色つきで表示されます。

この HTTP_PROXY_CONNECTION というのは、プロキシ接続をしていない場合の HTTP_CONNECTION とおなじようなもので、プロキシを経由しているということを示します。
HTTP_CACHE_CONTROLというのは串サーバのキャッシュ速度です。この数値が少ないほど速い串といえます。
ここで注意していただきたいのは「速い」と言いましたが、これは串サーバが速く読み込もうとする、という意味ですので、ネットが混雑している時間帯などはデータを読み込みきれずに、ブラウズし損ねることもあるので必ずしも快適な速度でブラウジングできるといった意味合いではないです。

つまり、キャッシュする時間が短いということでサーバが混雑しているときなどにデータを読み損ねてつながりにくくなったりすることもあるということですね。

この項目以外が(厳密にはクライアントの情報が)漏れているプロキシを通称 漏れ串 といいます。
.漏れ串といっても様々なランクにわけることができます。
例えば漏れている情報がプロキシ特有の変数の場合、これは漏れていても大して気にするほどのものではありません。しかし、なかにはクライアントの情報(IP、ホスト名)などをチェックされる項目によっては漏らしている場合があります。こういうプロキシはランクの低い串=匿名度の低い串(ここからはプロキシのことを串とよぶことにします)となります。

まずはじめにどのような串が良い串なのか説明しますね。
変数 HTTP_PROXY_CONNECTION , HTTP_CACHE_CONTROL以外にプロキシと思わせる項目がでない。
しかも、串のホスト名に、串と思われる文字列がない。この文字列なんですが、掲示板などではよく串避け(プロキシ制限)をかけているようなところでよくチェックされる項目です。
文字列には次のようなものがあります。

proxy , cache , delegate , keeper , www , dns , us , ch , ns ,nns

以上に挙げたような文字列があれば串と判断されます。このほかにも串と判断.される文字列.はたくさんあります。
このような文字列のない匿名串はCGIが生ホストであると勘違いし、串であると認識しません。ですから、このような串を回避するにはまずこの串のIPをチェックしておき、そのIPなら拒否するというかたちであらかじめ登録しておかなければばなりませんね。
 では次に漏れ串とはどのようなものなのか。代表的な例を挙げていこうとおもいます。もちろんこれから紹介する変数の項目が漏れているとCGIに串として認識されてしまいます。とりあえず見てみましょう。

HTTP_VIA:これは串経由という意味です。

ここにはプロキシのドメイン名や、バージョン、串経由の情報等が格納されます。また串によっては文末に for 125.135.145.155 というように生IPまで付加しちゃってくれたりするものもあります。(笑)このような串は匿名とは言えませんね。

HTTP_FORWARDED:これも串経由で、串サーバの情報などが格納されます。

ここには大抵、串サーバのアドレスとポート、その他その串自体に関連する文字列が入ります。
ところが、これまた串によっては for 125.135.145.155 とか、生ホスト for 1025.mulfac.ne.jp いうような、生情報を付加しちゃってくれたりもします。

HTTP_X_FORWARDED_FOR:この項目は漏れていない串ならば unknown として表示されます。一応、設定されている項目は経由しているIPだそうです。

ここにも面白い変数が漏れてしまったりします。大抵は、unknownとか、串のIPとポートなどが表示されるのですが、串によっては、生IPや生ホスト、また、串IPのあとに生IPが続けて表示されることもあるようです。一番おかしかったのは、 127.0.0.1 と表示された串ですね・・・・・。これってローカルIPなんですよね。つまりサーバー上のIPではないってことなんです・・・。わざと・・・なのかなこれは。(笑)

ここまで挙げてきた項目が普通にチェックされるような変数です。このほかにもプロキシであると認識させるような変数がいくつかあります。つぎのコーナーではここでは紹介されていない、しかも変数によってはとんでもない情報まで吐いてしまっているというよう なものを紹介します。

プロキシ接続で吐く特殊な変数

どの串を経由するかによって吐く変数は様々ですが、中には生IPを丸ごと吐いたり、ローカルに保存されているクッキーの情報やブラウザに設定されているメールアドレス、また、串サーバにいつから繋いでいるのかというような情報までも吐きだしてしまう串があります。 串サーバ独自の変数を吐いたりするものもあります。

HTTP_CLIENT_IP:ここには普通クライアントのIPが格納されます。

この変数を吐いていた場合、大抵はクライアントの生IPが表示されるのですが、串によっては、串独自のIPなどが出ることもあります。また、生IPが CDEBDEC2 というような具合で16進数で漏れていることもあります。

HTTP_SP_HOST:ここに生ホストが漏れることがあります。

ときどきこの変数を吐いている串があります。ここにはバッチリ生ホスト名が出ます。

HTTP_FROM:ここにはクライアントIPが格納されます。

この項目にも生IPと串ホスト、ポートがばっちり漏れていることがあります。

HTTP_IF_MODIFIED_SINCE:ここにはクライアントが串サーバに繋いだ時間が格納されます。

これは結構深刻な漏れ方です。悪戯などした場合、串に繋いだ時間はすでにばれていますので、速攻で見つかります(笑)

HTTP_COOKIE:ここにはクライアント側のクッキー情報(!)が格納されます。

私はよくわからないのですが、チャットや掲示板でクッキーを受入れていた場合、その情報が表示されることがあります・・・・・・。(怖っ!)

HTTP_FORM:ブラウザに設定されているメールアドレスが格納されます。

なんかよくわかりませんが、どっかのメールアドレスが表示されるみたいです。(笑)

HTTP_CACHE_INFO:キャッシュに関する文字列が格納されます。

これもよくわからないんですが、串サーバのキャッシュの情報等が表示されるようです。

HTTP_X_LOCKING:クライアントのIPやREFERER(参照元)情報が格納されるようです。

!確認 : HTTP_VIA , HTTP_FORWARDED , HTTP_X_FORWARDED_FOR

この三つの変数は必ずチェックするようにしましょう。

最後に串によって独自の変数を吐きだすものがあったので、書いておきましょう。

HTTP_CLIENTIP:HTTP_CLIENT_IPと同じようです。

HTTP_XROXY_CONNECTION:HTTP_PROXY_CONNECTIONと同じようです。

REMOTE_IDENT:なんか串独自の変数ではないみたいなんですが、まだ一回しか見たことないので、よくわかりません。設定ではサーバが実行するidentタイプらしいです。

REMOTE_PORT:WEBページを読み込む際に使用するポートが格納されるようです。クライアント側からこのポートを指定することはできないようですね。WEBページをHTTP転送プロトコルによって表示させるためのHTTPポートは[80]等ですが、それとはまたべつもののようです。

HTTP_SEPHIRA:旧ガブリエナイのヴァージョン情報

最後にちょっと。

これまで説明してきた環境変数ですが、頭にHTTP_とつく変数は専用のソフトを使えば書換えることが可能です。まぁ、書換えたからといってどうというわけではないですが、匿名度を高めるための一つの手段といえます。また、串の漏れ修正などにも使えます。
こういったソフトを使って任意のHTTP変数を吐いてそれをCGIにチェックさせるといったセキュリティなどを作ってみるのも面白いかと思います。ということで環境変数のお話はこれで終りです。

[ BACK ]

CopyRight© Setuna 1999 kyakusenbi@love.email.ne.jp