CGI の小部屋


環境変数を見てみよう 詳しい説明 こちらが得ることのできるあなたの情報を表示します。
ソースを表示してみよう 詳しい説明 ソースを表示します。
expnしてみよう 詳しい説明 入力したメールアドレスが実在するかわかる…かも。
ASCII アートしてみよう 詳しい説明 画像を文字だけで表示します。
nslookup してみよう 詳しい説明 FQDN と IP アドレスの相互変換を行います。
traceroute してみよう 詳しい説明 ネットワークのつながりを調べます。
whois してみよう 詳しい説明 NIC のデータベースから検索します。
MIME デコード 詳しい説明 MIME のデコードを行います。

環境変数を見てみよう

こちらが得ることのできるあなたの情報(IPアドレス、OS、ブラウザ)を表示します。
意味がわかっているものについては説明をつけました。

詳しい説明へ

ソースを表示してみよう

URL (http://www.goo.ne.jp/index.html など) を入力してください。 相手先 web サーバに HTTP リクエストを送り、データを取得します。 アクセスすると新しいウィンドウが無限に開いてしまうとか、ブラウザが落ちてしまうと いったページがあります。そのようなページはこの CGI を使ってソースをチェックしてください。 念のため言っておきますが、CGI のソースを表示するわけではありません。
ヘッダとボディ ヘッダのみ ボディのみ
HTML 形式で出力 プレインテキストで出力
詳しい説明へ

expnしてみよう

メールアドレス (hoge@fuga.com) を入力して下さい。実在するメールアドレスかどうか調べます。 一応 MX レコードには対応していすが、ネットワークの知識が あまりないので、間違った結果になるかもしれません。
詳しい説明へ

ASCIIアートしてみよう

バグを退治するまで閉鎖します。 ⇒ 詳しい説明へ

nslookupしてみよう

ホスト名 (X68000.q-e-d.net など) か IP アドレス (210.155.201.169 など) を入力してください。
そのホストのドメインネームと IP アドレスを調べます。 1つの入力につき、正引き(ホスト名からIPへの変換)と逆引き (IP からホスト名への変換) を行います。また、スペースで区切ることで、複数のホスト名・IP アドレスを一括して変換できます。
詳しい説明へ

tracerouteしてみよう

ホスト名か IP アドレス (例えば www.yahoo.co.jp) を入力してください。
この CGI プログラムが設置されている X68000.q-e-d.net と 指定のホストの間のネットワークのつながりを調べます (少し時間がかかります)。
詳しい説明へ

whoisしてみよう

ドメインネーム (例えば educ.cs.gunma-u.ac.jp なら gunma-u.ac.jp、 www.sega.co.jp なら sega.co.jp) を入力してください。 そのドメインの組織名、使用 IP アドレス、住所などを調べます。
詳しい説明へ

MIME デコードしてみよう

MIME エンコードされた文字列 (=?ISO-2022-JP?...?=) を入力してください。
詳しい説明へ

ちょっと詳しい説明


環境変数の説明

こちらが得られるあなたに関する情報は くらいです。また、Proxyサーバを経由している場合でも、多くのProxyサーバは アクセス元がわかるように情報を追加しますので、本当のアクセス元が隠せるとは 思わない方がいいでしょう。

それ以外の情報は、CGIを作る人が参考にしてください。perlなら 「$ENV{環境変数名}」でこれらの情報を取得できます。

ちなみにこれらの環境変数は大別して

があります。これらの環境変数を *実際に* セットしているのはWWWサーバです。

ソース表示の説明

先日、とあるリンクをクリックすると、Netscapeが新たなウィンドウを次々と 開き始めてしまい、一度Netscapeを終了させなければなりませんでした。 ダウンローダでそのURLの中身を見てみると
<HTML>
<BODY Onload="var i=0;while(1){(一部削除)++);}">
</BODY>
</HTML>
とだけ書いてありました。むかついたので、こういう腐ったページの対策として このCGIを作りました。怪しいURLがあったら、これを使って事前にチェックすると いいでしょう。

expnの説明

メールアドレスは「j5306050@educ.cs.gunma-u.ac.jp」のように、 「ユーザ名@ホスト名」という構成をしています。

この「ホスト名」で指定されたホストには、 SMTP(Simple Mail Transfer Protocol)サーバが動いています。 このSMTPサーバは、そのホストに属する全ユーザのメールの 処理を行っています。

SMTPというのはSMTPサーバとやりとりするためのプロトコルです。 SMTPはRFCで定められているのですが、SMTPの中に 「EXPN」というコマンドがあります。 これは「EXPN ユーザ名」という書き方をすると、 SMTPサーバが指定されたユーザは存在するかどうかを 知らせてくれます。

しかし常に正しい答えが返ってくるとは限りません。

MXレコードのお話

上に、メールアドレスとは「ユーザ名@ホスト名」である、と書きましたが、 pingやnslookupで調べることができないホスト名があります。 「matsu@kiryu.co.jp」を例にあげましょう。
% ping piryu.co.jp
ping: unknown host kiryu.co.jp
% nslookup kiryu.co.jp
*** No address (A) records available for kiryu.co.jp
と、kiryu.co.jpにアクセスすることはできません。 しかし、このメールアドレスは実在しますし、 実際にメールを送信することもできます。

これはMXレコードという仕組みを使っているのです。 MXはMail eXchangerの略で、MXレコードを使うと メールアドレスを短く記述したり、複数のホストに属するユーザの メールを一元管理することができます。

MXレコードの調べ方はnslookupを使います。

% nslookup
> set type=mx
> kiryu.co.jp
kiryu.co.jp     preference = 10, mail exchanger = ns.kiryu.co.jp
この「mail exchanger = ns.kiryu.co.jp」というのが MXレコードです。ns.kiryu.co.jpではSMTPサーバが 動いていますので、あとはns.kiryu.co.jpのSMTPサーバに 「expn matsu」を送るだけ、というわけです。

なお、似たような用途のものとして、

があります。

ASCIIアートの説明

例えば 球の画像を ASCII文字だけで構成すると
        o"o"o"ooo
          "oM"o"o"oo
          M M M"oM"oM
  "      M M"oM"o"MoMo
  "ooo"oM"o"oM M"MoM"M
  "oo"M M"oMo"M"MoMMM"
   "o"oM Mo"oMM"MoMMM
     "M Mo"MoM"MMM""
       """"MoMM""
となります。やっていることは そして最終的にASCII形式のテキストを出力しています。 これらのプログラム群は、netpbmというUNIX用の画像コンバータに含まれています。

あまり細かい画像だとうまくいきません。 また、明暗のはっきりしたものの方がうまく変換できます。


nslookupの説明

123.124.125.126 などという数字の列をIPアドレスといいます。 インターネットには多くのコンピュータが接続されていますが、 その中からコンピュータを特定するのにIPアドレスを使います。 例えば 133.8.2.34 というのはあなたが今アクセスしている群馬大の WWW サーバの IP アドレスです。IP アドレスがわかれば、世界中でただ1台のコンピュータを特定できます。
(本当は、コンピュータと IP アドレスが 1対1に対応しているのではなく、インタフェースと IP アドレスが 1対1に対応しているのですが、それは置いときましょう)

一方、www.cs.gunma-u.ac.jp のようなホスト名の書き方を、 ドメインネームといいます。 www.cs.gunma-u.ac.jp と 133.8.2.34 は同じコンピュータを指します。 群馬大学情報工学科のページは http://www.cs.gunma-u.ac.jp/ですが、 http://133.8.2.34/を見ても同じページが表示されるはずです。 つまり同じコンピュータを表すのに IP アドレス (133.8.2.34) とドメインネーム (www.cs.gunma-u.ac.jp) という 2つの方法があるわけです。

IP アドレスとドメインネームの相互変換をしてくれるのが、 nslookup というコマンドです。

IP アドレスとドメインネームの変換は、 DNS サーバにアクセスすることによって行われています。 上の nslookup に www.cs.gunma-u.ac.jp を指定すると
Server:  papa.cs.gunma-u.ac.jp
Address:  133.8.2.3

Name:    www.cs.gunma-u.ac.jp
Address:  133.8.2.34
と表示されます。上の Server: papa.cs.gunma-u.ac.jp というのは、 DNS サーバとして papa.cs.gunma-u.ac.jp を指定した、ということです。 つまり「papa.cs.gunma-u.ac.jp に問い合わせた結果、 www.cs.gunma-u.ac.jp と133.8.2.34 は等価である」ということを 表しています。

同じコンピュータを特定するのに、IP アドレスとドメインネームという 2つの方法があるのには理由があります。コンピュータ側からすれば IP アドレスだけでも全く問題はありません。むしろ4バイトという固定長の データなので、IP アドレスの方が扱いやすいのです。

しかし人間からすれば IP アドレスはただの数字の羅列にしか見えません。 www.cs.gunma-u.ac.jp は覚えようと思えば覚えられるでしょうが、 133.8.2.34 はどうでしょう。覚えられますか? つまりドメインネームは人間様の都合によって存在しているのです。

「ならば、人間が我慢してIPアドレスを覚えれば、ドメインネームなしで インターネットは成り立つのではないか」
それはそのとおりで、IPアドレスは存在するがドメインネームは付けられていない、 というコンピュータもたくさんあります。 例えば133.8.20.174というIPアドレスは存在しますが、ドメインネームはありません。 こういうIPアドレスがどこに属するのかはwhoisを使って調べてください。 しかしその逆の、ドメインネームはつけられているがIPアドレスはない、 というホストは存在しません。ネットワークに接続されている全ての ホストにはIPアドレスが付けられています。

IP アドレスのお話

IP アドレスについてもう少し詳しい説明をします。 IP アドレスは aaa.bbb.ccc.ddd という形式の 32ビット(=4バイト) の数字で表されます。 つまり aaa、bbb などの部分はそれぞれ 8ビット(=1バイト) で、0〜255 までの 256 種類の 数字を表すことができます。 ですから IP アドレスは 0.0.0.0 から 255.255.255.255 までの42億9496万7296個存在します。 しかし 0 や 255 は特殊な意味を持ちますし、 プライベートアドレスという登録せずに自由に使っていい IP アドレスもありますので、 実際に使用可能な IP アドレスはもっと少なくなります。

IP アドレスはネットワークアドレスとホストアドレスという2つのアドレスの情報をまとめた 形になっています。 例えば 133.8.2.34 という IP アドレスのネットワークアドレス部分は 133.8、 ホストアドレス部分は 2.34 です。 また 15.255.152.4 という IP アドレスのネットワークアドレス部分は15、 ホストアドレス部分は255.152.4です。

この違いを見ていただけるとわかりますが、IP アドレスといってもいろいろと種類があります。

クラスAaaa.bbb.ccc.dddのうち、aaaがネットワークアドレス。bbb.ccc.dddがホストアドレス
クラスBaaa.bbb.ccc.dddのうち、aaa.bbbがネットワークアドレス。ccc.dddがホストアドレス
クラスCaaa.bbb.ccc.dddのうち、aaa.bbb.cccがネットワークアドレス。dddがホストアドレス

クラス A の例が hp.com (ヒューレットパッカード) です。HP に割り当てられた IP アドレスは 15.0.0.0。ホストアドレスの数は 256*256*256=16,777,216。 つまり HP は自社のコンピュータを1677万台のコンピュータを インターネットに接続できるわけです (これまた本当に使用可能な IP アドレスはもっと少ないです。具体的には、 ホストアドレスが全て 0 の IP アドレスと、ホストアドレスが全て 255 の IP アドレスは特別です。例えば 15.0.0.0 はゲートウェイアドレス、 15.255.255.255 はブロードキャストアドレスです)。

一方 gunma-u.ac.jp はクラス B です。ネットワークアドレスは 133.8 で、 ホストアドレスの数は 256*256=65536。

クラス C はホストアドレス 256。

つまりネットワークの規模に応じてクラス分けをしているのです。 大企業は数千台、数万台をつなげられるようなクラス B を、 中小企業は数十台規模でいいのでクラス C を…という構想だったのですが、 ちょっと困ったことがおきました。IP アドレスが足りなくなったのです。

はっきりいっていくら HP といえども 1677 万の IP アドレスは必要ありませんし、 gunma-u.ac.jp も 65536 より少なくても運用できます。だからといって gunma-u.ac.jp をクラス C にすると 256 個の IP アドレスしか使えませんが、 これは少なすぎます。つまりクラス A、B、C の分け方がおおざっぱすぎて 多くの IP アドレスが無駄になってしまうのです。

そこで CIDR というシステムが導入されました。クラスという分け方をせずに、 「aaa.bbb.ccc.dddという IP アドレスのここからここまでがネットワークアドレス、 残りがホストアドレス」というふうにすることで、 効率よく IP アドレスを使おうとしたのです。

クラス A である hp.com を CIDR で表記すると 15.0.0.0/8 となります。 上位8ビット (=1バイト) はネットワークアドレスであり、残りの 24 ビットは ホストアドレスである、ということです。 クラス B は aaa.bbb.ccc.ddd/16 です。


tracerouteの説明

インターネットとはたくさんのコンピュータをつなげたものです。 例えば群馬大は直接的にはSINETにしかつながっていませんが、 全世界との通信路が確保されています。 つまり蜘蛛の巣のように近くのホスト同士がつながっているので、 その蜘蛛の糸をたどっていけば目的地にたどり着くことができるのです。

tracerouteはどういうルートを通って目的地にたどり着いたかを 調べるツールです。Windowsではtracertという同機能のコマンドがあります。

このページのtracerouteは任意の2地点間のルートを調べることはできません。 「www.cs.gunma-u.ac.jpと任意の地点間のルート」を調べるためのものです。

tracerouteの仕組み

ネットワークでデータのやりとりをするにはパケットを送信しますが、 パケットには送信内容と共に宛先などの各種ヘッダが付いています。

tracerouteは、ヘッダの中のTTLフィールドを利用して実現されています。 TTLとはTime To Liveの略で、そのパケットが 「ネットワークで生存できる時間」を表しています。 TTLは始めにパケットを生成したホストが決定します。

ゲートウェイ(ホスト)を1つ通過するたびに1引かれていき、TTLが 0になったら、その時点でパケットを破棄し、生成元のホストに 「うちでパケットを破棄しました」と知らせてくるわけです。

ということは、TTLが1のパケット、TTLが2のパケット、TTLが3のパケット、 TTLが4のパケット…と順に送っていくと、通過したゲートウェイから、 破棄した旨の連絡が届き、結果としてパケットが通過したルートがわかるわけです。

TTLは規格上は文字通り「生存可能時間」を表すことになっています。 1つのゲートウェイの通過に3秒かかったら、そのゲートウェイでは TTLを-3しなければなりません。しかし現実には秒数に関係なく TTLは-1されます。 規格通りに実装するとオーバーヘッドが大きくなるからでしょうか。


whoisの説明

jpドメインの管理はJPNICが 行っています。主な管理内容はIPアドレスの割り当てです。 JPNICが管理している情報は誰でも見ることができます。 それがwhoisというシステムです。

例えば gunma-u.ac.jp については このような情報が登録されています。

jpドメインに関しては、ほとんどの場合〜.〜.jpとなるようにすれば 大抵はうまくいきます。 例えばfoo.bar.co.jpというドメインネームなら、bar.co.jpを指定します。 abc.def.efg.ac.jpならefg.ac.jpを指定します。 例外はntt.jp、nttdata.jp、kek.jp、地域型ドメインです。地域型ドメインとは nagoya.jp、hokkaido.jpなどの「県名(地域名).jp」という形をしています。

例えばgunma-u.ac.jpはうまくいきますが、cs.gunma-u.ac.jpや www.cc.gunma-u.ac.jpはうまくいきません。これはJPNICは IPアドレスの割り当てのみを決めるからです。gunma-u.ac.jpの例を みると、

s. [使用IPネットワーク]       133.8.0.0
となっています。これは「133.8.〜.〜という IP アドレスは群馬大学のみに 貸し与える。さらにgunma-u.ac.jpの管理も群馬大学が行う」ということです。 つまり「133.8.以下の2バイトについては 群馬大学が管理する。また〜.gunma-u.ac.jpについても どんなサブドメインを付けるかは群馬大学が決める。 これらに JPNIC は関与しない」という意味でもあるのです。 ですから JPNIC のデータベースでわかるのは gunma-u.ac.jp までです。 cs.gunma-u.ac.jp も cc.gunma-u.ac.jp も si.gunma-u.ac.jp も tech.gunma-u.ac.jp も JPNIC が管理しているわけではありませんので whois で問い合わせても うまくいかないのです。

whoisでドメインネームを元に検索する方法は上に書いた通りです。 次にIPアドレスを元に検索する方法を説明します。

133.8.2.34 という IP アドレスはどの組織に属するかを調べてみましょう。 何も考えずに下の 2バイトを 0にしてください。つまり 133.8.0.0 を whois に かけてみてください。群馬大学についての情報が出てきました。

では次に203.183.23.1を調べてみます。同じように203.183.0.0で調べてみると 何も出てきません。そういう場合は一番下のバイトのみ0、つまり203.183.23.0 で調べてください。するとbig.or.jpのIPアドレスであることがわかります。

a.b.c.dというIPアドレスならまずはa.b.0.0、それがダメならa.b.c.0で 調べてみると大抵の場合わかります。しかし202.248.142.132のような場合もあります。 202.248.0.0とするとinfowebだとわかりますが、202.248.142.0で調べると inforyoma.or.jpとなっています。これはinfowebがIPの一部をinforyomaに 貸しているのかもしれません(よくわからない)。

どうしてもわからなかったら次の資料を参考にしてみてください(サイズが非常に大きいので注意)。

全IPのリスト(JPNIC)(1.8MB)
全ドメインのリスト(JPNIC)(2MB)


JPNICは日本のIPアドレスとドメインを管理しますが、 インターネットは全世界につながっているので、各国のNICを統括する組織が必要です。 それがINTERNICです。 INTERNICは「日本が使っていいIPアドレスはこれとこれ、ドメインはjpだよ」と決めます。 同じように「イギリスは…、フランスは…」と全ての国に関してのIPアドレス・ドメイン についての割り当てを決めます。

ですからnetscape.comの情報についてはJPNICに問い合わせてもダメです。 JPドメインではないのですから当然ですね。この場合はサーバをINTERNICとして whoisしてください。ちなみにcom、org、net、eduなどは 米国のトップドメインではありません(米国はusというトップドメインを持っています)。 これらはインターナショナルなトップドメイン、 つまり国という概念とは関係ない性格のドメイン(world-wide generic domain)ということです。

もう少し細かく言えば、INTERNICがIPアドレスの一部をAPNIC(アジア地域を管理)に 割り当て、APNICがその一部をJPNICに割り当て、JPNICがその一部を各企業や学校に 割り当てている、ということになります。

最後に注意ですが、whoisは本来はネットワーク運用者のみが使うものです。 だから使ってはダメとまではいいませんが(自分も使ってるから)、 乱用しすぎてネットワークに負荷をかけるようなことだけは絶対に避けましょう。


MIMEデコードの説明

MIMEエンコーディングというのは、メールやNetNewsの「Subject:」や「From:」に 日本語を埋め込むための規格です。形式は
=?コード形式?B?BASE64変換された文字列?=
となっています。コード形式というのは などがあります(もちろん日本語だけを対象とした規格ではありませんので、 各国の言語をエンコードすることもできます)。

BASE64変換というのは、元の文字列を3バイト(=24ビット)ごとに区切り、 切り出した24ビットをさらに6ビットごとに分割します。 6ビットですから、0から63までの数値を表せます。この数を 「ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/」 に対応する文字で置き換えます。 結果的に3バイトが、4文字の7ビットASCII文字に変換されるわけです。

…という難しいことは置いといて、MIME デコードは 全て nkf コマンドにおまかせしています。実装の問題でしょうが、 nkf は =?ISO-2022-JP?B?...?= というMIMEコードしか認識しないようです。 そこで =?Shift_JIS?... や =?EUC-JP?... は事前に =?ISO-2022-JP?... に 変換しています。ISO-2022-JP 以外のMIMEコードを使うことは あまりないのですが、とりあえずデコードはできているようです。

ちなみに MIME には B エンコーディングと Q エンコーディングがあり、 それぞれ

=?コード形式?B?BASE64変換された文字列?=
=?コード形式?Q?BASE64変換された文字列?=
という形式になっています。

$Id: index.html,v 1.13 2017/03/20 16:06:06 68user Exp $