前へ << CGI プログラムのデバッグ | 負荷について考える >> 次へ |
これまでに出てきた $ENV{'QUERY_STRING'}、$ENV{'REQUEST_METHOD}' のように、 CGI プログラムが環境変数を参照することで、いろいろな情報を知ることができます。どのような環境変数がセットされているか、という正確な定義はありません。 現状では RFC として決まっているわけではないからです。 ここでは apache でセットされる一般的な環境変数を解説します。
まず、先頭に HTTP_ が付くもの、例えば HTTP_COOKIE、HTTP_USER_AGENT があります。 これらは HTTP クライアント (ブラウザ) が勝手に送ってきたものです。 ブラウザは WWW サーバに対してGET /~68user/webcgi/ HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/4.61 [ja_JP.EUC] (X11; I; FreeBSD 3.3-RELEASE i386) Host: localhost:8080 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* Accept-Encoding: gzip Accept-Language: ja, en Accept-Charset: iso-8859-1,*,utf-8というようなリクエストを送ってきます。例えば User-Agent: Mozilla… という ヘッダは先頭に `HTTP_' を付けて、`-' を `_' に変え、全て 大文字に変えて環境変数にセットします。つまり User-Agent というヘッダは $ENV{HTTP_USER_AGENT} で参照できるわけです。HTTP_ で始まる環境変数は信用してはいけません。HTTP クライアントを 作るのは非常に簡単です。
User-Agent: hoge <A HREF="foo/bar">fuga<A>というのを送ってくるかもしれません。掲示板プログラムで、 うかつにこのデータを HTML ファイルに書き込むと、 User-Agent の部分に好きなタグを書き込まれてしまいます。 また、クライアントがHogeHoge: fugafugaなどと勝手に考えたヘッダを送ってきた場合でも、$ENV{'HTTP_HOGEHOGE'}='fugafuga' という 環境変数がセットされます。これを見て、「HTTP_HOGEHOGE という環境変数があるんだな」 と早合点してはいけません。逆に言うと、頭に HTTP_ が付いていない環境変数は それなりに信用できるということです。
環境変数 REMOTE_ADDR には、クライアント (訪問者) のIP アドレスが入っています。一方、 環境変数 REMOTE_HOST には、クライアントの「ホスト名が入っている環境もあります」が、 「大抵は IP アドレスが入っています」。どっちやねんと思うかもしれませんが、根本的には 「Web サーバが IP アドレスの逆引きを行ってくれるかどうか」に帰着します。 Web サーバはクライアントの IP アドレスは必ず知っています。 なぜならリクエストのヘッダ部分 (正確には IP データグラムのヘッダ) に、 クライアントの IP アドレスがセットされているからです。 しかしヘッダ内にはホスト名は記述されていません。 よって、ホスト名を知るには DNS サーバに
「IP アドレス aaa.bbb.ccc.ddd に相当するホスト名は何?」と問い合わせなければいけません。これを「IP アドレスの逆引き」と言います。Apache-1.2.x のデフォルトの設定では「IP アドレスの逆引きを行う」となっていたので、 環境変数 REMOTE_HOST にホスト名が格納されるようになっていました。 しかし Apache-1.3 からデフォルトの設定が「IP アドレスの逆引きを行わない」 と変わってしまいました。逆引きを行わない場合は環境変数 REMOTE_HOST には クライアントの IP アドレスがセットされます (つまり環境変数 REMOTE_ADDR と同じ値が入っている)。
逆引きを行うかどうかは管理者が自由に変更できますので、 サーバによっては「IP アドレスの逆引きを行う」という設定になっていて、 環境変数 REMOTE_HOST にホスト名が入っているかもしれません。 でも、デフォルト設定のままになっている可能性が高いと思われます。
ちなみに Apache の設定ファイル httpd.conf において HostnameLookups Off とすれば逆引きが行われません。 逆に HostnameLookups On とすれば逆引きが行われます。 逆引きというのはちょっとだけマシンに負荷がかかり、 ちょっとだけネットワークが混雑し、 ちょっとだけページ表示完了までの時間が長くなるので、 Apache 開発チームはデフォルト off を選択したわけです。
前へ << CGI プログラムのデバッグ | 負荷について考える >> 次へ |