閲覧者のホスト名を得るサブルーチンを作ってみます。
アクセスログを取る時に使われる処理です。
掲示板等のCGIではこれを投稿記事上に表示して荒らしの予防にする場合もあります。
ここで使用する環境変数は以下の2つです。
$ENV{'REMOTE_ADDR'} IPアドレス
$ENV{'REMOTE_HOST'} ホスト名
$ENV{'REMOTE_HOST'}ではホスト名が得られずに何も格納されなかったり、IPアドレスが格納される場合があります。
その場合はgethostbyaddr()関数でDNSサーバに問い合わせてIPアドレスから逆引きしてホスト名を得るように試みます。
しかし、それでもホスト名が得られない場合は仕方がないのでIPアドレスをホスト名とします。
|
|
sub get_host {
$host = $ENV{'REMOTE_HOST'};
$ip = $ENV{'REMOTE_ADDR'};
if ($host eq '' || $host eq $ip) {
$host = gethostbyaddr(pack("C4", split(/\./, $ip)), 2) || $ip;
}
}
|
|
pack()関数
"C4"とはchar型(1バイト)が4つのデータ(32ビット)の事です。
split()関数によりIPアドレス(10進数の4区切り)のリストを与えて最終的に32ビットのデータを生成します。
|
|
gethostbyaddr()関数
pack関数により与えられた32ビットのデータを元にDNSサーバからホスト名を逆引きします。
IPアドレスは現在、IPv4方式ですから、この場合は引数を2とします。
将来IPv6方式になった場合は引数を10とするようです。
|
|
■ホスト名やIPアドレスでアクセス制限を行う際の注意事項
ホスト名はhost.domain.ne.jpのように最後に国名が付き4つに分かれるタイプやhost.domain.comのように最後に国名が付かず3つに分かれるタイプなどがあります。
また、5つや6つに分かれるタイプなどもあります。
それぞれのホスト名はワイルドカードを使うと「*.domain.ne.jp」または「*.domain.com」と表す事が出来ます。
ホスト名は一番左の区切りが接続の度に変わる為です(ホストによっては複数区切りが変わる)。
これとは逆にIPアドレス(例えば255.100.200.10)の場合は255.100.200.*と表す事が出来ます。
IPアドレスは一番右の区切りが接続の度に変わる為です(ホストによっては区切り2つが変わる)。
|
|
|
インターネット接続が切り替わる度にホスト名やIPアドレスが変わってしまうのでアクセス制限を行う際は上記の様にワイルドカードを使用して行う事が必要ですが、そのホストから接続している全てのユーザも対象になってしまうので注意して下さい。
|
|
■補足
プロキシサーバを経由して閲覧している場合は$ENV{'REMOTE_ADDR'}や$ENV{'REMOTE_HOST'}にはユーザがある程度特定出来るホストの情報ではなくプロキシサーバの情報が格納されます。
プロキシサーバによっては$ENV{'HTTP_VIA'}や$ENV{'HTTP_FORWARDED'}や$ENV{'HTTP_X_FORWARDED_FOR'}を参照する事によりユーザの生IPアドレスなどを取得出来る事があります。
しかし、このような匿名性のないプロキシサーバはユーザにとって利用価値のないものですから、これらの環境変数をチェックしてユーザの生IPを取得出来るケースは殆どありません。
|
|
□更新履歴
2007.04.10 補足の内容を見直し
2006.11.23 補足を追加
2006.01.02 全体的に内容を見直し
|
|
|