Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

ホスト名を知る

研究内容

訪問者のリモートホストを調べる研究です。

詳細

リモートホストって?

リモートホストというのは、 IPアドレスを人間に分かるような文字列にしたものです。

IPアドレスは、数値が4つ並んだだけで人間が見てもなんだか分からない ですよね。でも、IPアドレスからはリモートホストを知ることができて、 そのリモートホストから、訪問者がどんなプロバイダを使っているのかなんて ことが分かるんです。あるいは、会社からインターネットにつないでいるときは、 会社名が分かったりします。会社とかじゃなくても、 学校とか、なにかの団体とか、一般家庭のように電話回線でインターネットに つないでいるのでないときは、その場所が分かったりします。 IPアドレスのままではなんだか分からなくても、 リモートホストだとそんなことが分かっちゃうんですね…。 なんだか怖い気もしますが…。

リモートホストを得るには

Perlでは、リモートホストを得るための関数、 gethostbyaddr 関数が用意されています。

結果

gethostbyaddr 関数

gethostbyaddr 関数でリモートホストを得るには、ズバリ次のようにします。(完成形)

$ip   = $ENV{'REMOTE_ADDR'};
$host = gethostbyaddr(pack("C4", split('\.', $ip)), 2) || $ip;

ちょっとごちゃごちゃしています。 分解してみましょう。

$ip   = $ENV{'REMOTE_ADDR'};
@ads  = split('\.', $ip);
$ipb  = pack("C4", @ads);
$host = gethostbyaddr($ipb, 2) || $ip;

1行目の $ip はIPアドレスです。環境変数から取得できるんでしたね。 これは文字列で、xxx.xxx.xxx.xxx みたいな4つの数字をピリオド . で区切った形をしているんでした。

2行目の @ads は、配列です。split 関数によって、区切り . でIPアドレスを分割したものが 入ります。 \. となっているのは、. が特殊文字なので \ で エスケープしています。

3行目は、pack 関数です。pack 関数は、以前、フォームデータの デコードというところで出てきましたね。数値を、その数値に対応する文字に変える というものでした。その時は pack("C", 〜) という形でしたが、 今回は "C4" となっています。これは、4文字、という意味です。 @ads には数値が4つ入っているので、それぞれを文字に変えて、つなげて4文字の 文字列にするという意味になります。 ただし、今回、数値は必ずしも人間に読める文字になるわけではありません。 文字というよりも、1バイトのバイナリデータですね。 バイナリというのは、人間に読める文字としてのデータではないということを 強調したときのデータの呼び方です。 ということで、$ipb というのは、これはIPアドレスを、4バイトのバイナリデータに変えたものです。

そして4行目が、gethostbyaddr関数。 第一引数は $ipb で、IPアドレスの4バイトのバイナリ。第二引数は、数字の 2 ですが、 これはインターネット上でのIPアドレスに対応するホスト名を知りたいですっていう意味で、 いつも 2 です。 そして最後に、4行目の後ろの || $ip。この || は、A || B で、もしAが失敗したらB、という 意味になります。gethostbyaddr 関数は、ホスト名の取得に失敗することがありますので、 失敗したときはIPアドレスをそのままホスト名にしちゃいましょうという意味になります。

作成したCGIプログラム

host.cgi
#!/usr/bin/perl

$ip   = $ENV{'REMOTE_ADDR'};
$host = gethostbyaddr(pack("C4", split('\.', $ip)), 2) || $ip;

print "Content-type: text/html\n";
print "\n";
print "$host";

実行結果

下のリンクをクリックしてください。

貴方のホスト名を調べます。 (別窓で開きます)

実行結果

動きました

動きました!管理人の場合、「xxx.ppp.dion.ne.jp」となりました。 xxx のところには、英数字が入りますが、インターネットに接続するたびに 変わります。残りの部分から、管理人が利用しているプロバイダが DION だっていうことが バレバレですね (^^; まぁプロバイダがどこかなんて秘密でもなんでもないと思うので。

なんに使おうか

こうして、リモートホストからプロバイダがどこなのか分かりました。 でも、DION の場合、DION であること以外になんの情報もないので、これで終わりです。 でも、プロバイダによっては、住んでいる場所が分かったりもするみたいですね。 というのは、〜.tokyo.〜 みたいなリモートホストになったりするらしいです。 でも、管理人は興味無しだなあ。 結局のところ使い道が無い?

分かったこと

  1. ホスト名を得るには、gethostbyaddr 関数を使います。
  2. pack 関数で数字文字列をもとにバイナリデータを作ることができます。
  3. A || B で、Aが失敗したらB、ということができます。
Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。