host check cgi v2.0


★使用目的

ホームページへのアクセスをチェックし、登録されたドメインのユーザーを別のページへと導く。
 アクセスを許したくないユーザーのドメインを調べておき、そのユーザーのアクセスを拒否することが出来ます。
 ただし、ドメイン毎のアクセスチェックになるため同じアクセスプロバイダからのドメイン拒否には使用できません。(自分も見れなくなります)

★ファイル構成(1)

 CGIをページの入り口に設置し、ホストチェックを行う場合

 read me
 -index.html
 host_check.cgi
 log.csv
 NotFound.html

 基本的に必要なのは実行プログラムの host_check.cgi だけです。

★ファイル構成(2)

 既存のCGIにホストチェックのプログラムを組み込む場合

 NGhost_check.pl

 上記ファイルを既存のperlプログラムに読み込ませ、サブルーチンを呼び出すだけです。
 こちらの設定方法はNGhost_check.plの中を見てください。

★動作の仕組み

 サイトの入り口となるHTMLファイル(通常index.html)にアクセスを行うと、すぐさま host_check.cgi を呼び出します。
 アクセスした人のプロバイダ(リモートサーバー)がチェックされ、登録ドメインかどうかを判別し、それに応じてページを選択します。

★初期設定

 サーバーがCGI(perl)を使用できることが必要です。(SSIは不要です)
 -index.htmlの設定
 このファイルは使用例ですので、実際には内容のあるページでもかまいません。
 <META HTTP-EQUIV="Refresh" CONTENT="0;URL=host_check.cgi">
 を<HEAD>~</HEAD>の間に置くと、すぐにCGIを呼び出してチェックが始まります。
 リンクを設定して、そこから「host_check.cgi」を呼び出すこともできます。
 例:<A HREF="host_check.cgi">~</A>
 host_check.cgiの設定
 
 #!/usr/local/bin/perl
 (サーバーの設定に応じて変更する必要があります。CGIを実現するperlのプログラムを呼び出すための記述で、必ずファイルの1行目に必要です。)
 変更例:#!/usr/local/bin/perl5 , #!/usr/bin/perl , etc...

 $check_host = "yahoo.co.jp";
 アクセス拒否をするドメイン名
 複数あるときは「,」で区切ってつなげます。この時スペースを入れないように注意して下さい。
 例:$check_host = "yahoo.co.jp,yahoo.ne.jp,yahoo.or.jp";

 $next_page = "top.html";
 登録ドメイン以外からのアクセスだった場合に表示するページ。
 ページは自由に設定できます。サブディレクトリを作成してその中にサイトを引越すれば、更にサイトを隠すことができます。

 $skip_page = "NotFound.html";
 登録ドメインからのアクセス時に表示するページ。
 同梱の NotFound.html をリンク先に設定していますが、直接別のサイトを指定してもかまいません。
 例:$skip_page = "http://www.yahoo.co.jp/";

 $log = "cgi/log.csv";
 ログファイル名(log.csv)とそれを入れるディレクトリ名(cgi)です。
 どちらも自由に変更することができます。
 例:$log = "check/host.csv";

 $max = "1000";
 ログファイルの最大保存数です。この件数を越えた古いデータは削除されます。
 「0」件に設定するとログファイルを残しません。

 log.csvの設定
 これはログファイルと呼び、アクセスの状況を記録するものです。
 記録内容は check_host.cgi にアクセスした時間とリモートホスト名です。
 ドメイン名だけでなく、プロバイダに割り当てられた個別の識別部分も含まれています。
 例:xx999.yahoo.ne.jp
 この場合、xx999 には識別名が入り、yahoo.ne.jp がドメイン名となります。

 NotFound.htmlの設定
 偽物の Not Found を表示します。これは自由に内容を変更できます。
 複数のプロバイダを使ってアクセスされたときに、「サーバーの調子が悪くて見えないときがある」と言い訳できるようにしてあります。(分かる人には分かってしまうけど)
 表示後、<META>の中で自動的に切り替わるページを設定してあります。
 <META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://www.yahoo.co.jp/">
 5秒後に、http://www.yahoo.co.jp/へ移動するという設定です。

★基本的な使用手順

 リンクを自動または手動にして、host_check.cgi を呼び出すだけです。
 もちろん、これを複数のページに設置することもできます。
 -index.html には自動リンクが記述してありますので、これを「index.html」にリネームしてホームページに使う場合を例にしてみます。
 それぞれのファイルを次のようにftpで転送します。
 /~your/index.html
 /~your/NotFound.html
 /~your/host_check.cgi(755)
 /~your/cgi/log.csv(777)
 「host_check.cgi」のパーミッションは755に設定します。
 「NotFound.html」はindex.htmlと同じディレクトリに置きます。
 CGI ディレクトリはパーミッションを777に設定します。
 「log.csv」を cgi ディレクトリに入れ、書き込みができるようにパーミッションを777に設定します。
 
 これで、index.html をブラウザに読み込むと、そこから host_check.cgi が呼び出されて動作します。

★安全な使用方法
 同じディレクトリにファイル名をそのままで置いておくと、このページを見た人には分かってしまいます。
 そこで、index.html を使用しないで、BBSなどへのリンクを host_check.cgi に変えます。そこでチェックを行ってから、目的のページへとつなぎます。
 このとき、host_check.cgi も名前を変えてしまいます。(.cgi の拡張子は変えないでください)
 そして、さらに他のファイルも名前を変えてしまうと良いでしょう。ただし、host_check.cgi の中の $log と $skip_page の設定も忘れずに変更してください。
 これだけでかなり安全と言えます。ディレクトリ名、ファイル名に連想しにくいものを付ければそれだけ簡単に見つかることはありません。
(注)
 プロバイダの設定で、URL にファイル名を入れないでアクセスすると自動的に index.html など特定のファイルを呼び出すことが一般的です。
 その時、index.html を用意していないとディレクトリの中身全部が表示されることがあります。そうなると見せたくないディレクトリやファイルを公衆の面前にさらすこととなります。
 上記のログファイルを入れるディレクトリなどに index.html を用意して置けば、それが自動的に読み込まれるので、ディレクトリの中身を見られることはありません。

★さらに確実な使用方法

 アクセスログにはCGIを呼び出した時刻が記録されますが、上記の方法ではBBSへの書き込みに関わらず記録されます。それはそれでメリットはあります。
 しかし、来訪者の多いBBSなどでは書き込みの順序とBBSを呼び出した順序が変わってしまうことも多々考えられます。
 そこで、自己のサイトに設置したBBSの場合、BBSの書き込み後に host_check.cgi を読み込めばほぼ間違いなく記録を残すことができます。
 ただし、短時間に処理されるとはいえ、同時に書き込みが発生するとログが1つ飛んでしまう可能性があります。書き込みの時間とログの時間をかならず付き合わせて数の確認をしてください。
 同時書き込みを回避するためにロックファイルを用いる方法がありますが、これによりCGIの動作を停止させる方が問題ですので、この方法は取っていません。

★著作権

 秀麗(Shurey)
 http://www.shurey.com/
 [NetGurdianにて配布]
 http://gurdian.ne.jp/
 二次配布、改良による使用も自由にできます。
 ただし、改良を施した場合、新しいreadme.htmlを付けてください。