環境変数

前へ << CGI プログラムのデバッグ 負荷について考える >> 次へ

環境変数とは

これまでに出てきた $ENV{'QUERY_STRING'}$ENV{'REQUEST_METHOD}' のように、 CGI プログラムが環境変数を参照することで、いろいろな情報を知ることができます。

どのような環境変数がセットされているか、という正確な定義はありません。 現状では RFC として決まっているわけではないからです。 ここでは apache でセットされる一般的な環境変数を解説します。

先頭に HTTP_ がつくもの

まず、先頭に 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_HOST と REMOTE_ADDR

環境変数 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 プログラムのデバッグ 負荷について考える >> 次へ

$Id: env.html,v 1.4 2004/06/21 11:39:54 zxr400 Exp $