日本国内 IP かを判定するモジュール
以前ご紹介した「日本国内に割り当てられたIPの調査」を利用して、リクエスト元が日本国内かを判定する Perl module を作成しました。割り当て IP は時々刻々と変化していくので、いずれ陳腐化していくと思いますが、当面は利用価値のある module となると思います。
利用用途としては、Blog 等の Comment SPAM 対策などに利用できます( MT への組み込み方もあわせて紹介します。)
update 04.07.23 / 最新の IP リストを作成する CGI を同梱しました。
≫スクリプトはこちら(JpOnly.pm)
<動作環境>
Perl 5 が使える環境ならどれでも。(Linuxでしか動作確認してませんが...)
<モジュールの設置方法>
(1)メインCGIが設置してあるディレクトリ配下に 'Drk' いうディレクトリを作成します。
(2)ダウンロードしたファイルを解凍して、作成した'Drk' ディレクトリ配下に全てのファイルをFTPします。
(3)makelist.pl のパーミッションに実行権を与えます。755等に設定下さい。
(4)メインCGI内の #!/usr/bin/perl の下付近に、use lib "./"; を追加します。
以上で、メインCGI内で Drk::JpOnly が使用可能になります。
<Drk::JpOnlyのメソッド>
- $ipOK = Drk::JpOnly->new();
コンストラクタ。引数の時は、日本国内の IP アドレスからのリクエストの場合、1 を返す。それ以外は 0 を返す。
引数が"make"の時は、IP リストを作成するモードになる。(同梱の makelist.pl で使用)
makelist.pl をコマンドラインもしくは、Webブラウザ経由で実行下さい。ipfile.dat が更新されます。
<MT への組み込み方>
(1)MT をインストールした配下にある 'extlib' ディレクトリ内に 'Drk' いうディレクトリを作成して JpOnly.pm を FTP します。
(2)'lib/MT/App/Comments.pm' ファイル内にある 70行〜80行目あたりを下記のように編集下さい。
return $app->handle_error($app->translate("Comment text is required."));
}
use Drk::JpOnly;
unless( Drk::JpOnly->new ) {
return $app->handle_error('Post from overseas was Banned');
}
コメントやシェアをお願いします!
drk
kazui さん>うちではcronで毎日データをアップデートしています。
0 6 * * * perl /home/apache/cron/makelist.pl
プログラムはこんな感じです。
#!/usr/local/bin/perl -w
require "/home/apache/cron/JpOnly.pm";
my $pm = Drk::JpOnly->new("make");
kazui
kazui ともうします
3年程からlinuxで weblog を公開の準備を初め2年程から公開しております
昨年より外国から無法なアクセスが来るようになり、困っており昨年12月から
対策を検討してきておりました。
当初は iptables で何とかと勉強しましが・・諦め
透過モードのProxyで何とかと squid でと作ってみましが、この目的には・・?
諦めようと集めた情報を整理していましたが、
貴殿のページを改めてよくみていましたら、目的そのものであることが分かり
ました。
予備サーバで以下のように設定しましが、スキルが低く現用機にかける自信が
なく、以下のように設定してみましが
・間違がないか?
・更新方法もそれでよいか?
よろしくご教授お願いいたします。
<モジュールの設置方法>
予備準備で httpd-deve のインストール
# yum -y install httpd-devel
(1)・/var/www/cgi-bin/Drk/* に JpOnlyのファイル及びディレクトリを入れた
(2)・makelist.pl のパーミッションに実行権(755)を与えました
(3)・makelist.pl のファイルに以下の所に "use lib "./";" を
-- makelist.pl ----
#!/usr/local/bin/perl -w
use lib "./"; ・←ここに入れました
require "./JpOnly.pm";
my $pm = Drk::JpOnly->new("make");
#print $pm = Drk::JpOnly->new();
---------
以上で間違いないでしょうか
<最新の IP リストへ更新する方法>
・Webブラウザ経由で実行下さい。 ・単に "IE" で htttp://・・/cgi-bin/makelist.pl
選ぶ でよいでよいのでしょうか?
-以上-
S.A Studio
ウワァァ-----。゚(゚´Д`゚)゚。-----ン!!!!
#!/usr/bin/perl
use lib "./";
use Drk::JpOnly;
print "content-type text/plain\n\n";
print $ipOK = Drk::JpOnly->new();
print "\n";
こんな感じで使っても
Error: ipfile.dat: No such file or directory
とか出ちまう……。
Kunito
解答ありがとうございます。
教えてもらったのを今度実行してみたいと思います!
drk
Kunitoさま>サーバの環境によっては不具合があるようです。相手のIPアドレスを環境変数からうまく捕捉できない場合があるようです。代わりといっては何ですが、次のコードでもspam防止ができます。
use Jcode;
my $text = $q->param('text');
if( Jcode::getcode($text) eq "ascii" ) { return $app->handle_error('Post from overseas was Banned'); }
Kunito
おきらくはうすさん経由にてこちらを知りましたが、MTに組み入れる場合は、
説明の2点のみ実行すれば良いのでしょうか?
おきらきさんのとこにはコメントできたのに、自分のとこでは海外なんでダメよってエラーが出ます。