ほとんどはロボットである
掲示板らしき投稿物を探しては自動で投稿しまくっているものが大方を占めているように思います。
まずは、設置アドレスを変えることをお勧めします。これだけで当分の間防ぐことが出来ると思います。
そのためには、掲示板へのアクセスはメニュー経由にしておき(ホームページなど入口を作っておく)、
メニューを変更することで、利用者がアドレス変更を気にすることなく使えるようにしておくといいでしょう。
直接掲示板をブックマークしている方へは、他の方法で告知するしかありませんが…。
これは、迷惑メールで困ったらメールアドレスを変えるのと同じ理由です。
この方法でかなり防げます。またスパムが現れ出したら変更しましょう。
海外からの投稿を規制する
IPアドレスを調べることにより、どこから接続しているか判定がある程度可能です。
IPアドレスの範囲から地域を判定するデータベースを利用してチェックしますので、新たな国や地域が追加されれば、データベースも更新する必要があります。
なお、そのデータベースにデータがないIPアドレスを検知した場合は通常のホスト名の逆引きを行ってドメインを調査して、JPではない場合にエラーを返すようにしました。
エラー処理は &error(); だと仮定しますので、そのプログラムで使われている方法に書き換えてください。基本的に、プログラムの中の投稿時の内容チェックのルーチンの適当な位置に挿入して利用します。
この処理を紹介するにあたり、快く許諾をいただいた中村様に感謝いたします。→
不正アクセスの発信地の国別統計をとろう!
「IPから国別コード(ccTLD) が引けるようにしたリスト(ipaddr_to_cctld.txt)」の最新版もここからダウンロードし、下記 "what_country.pl" と同じ場所に設置してください。
require './what_country.pl';
$result = &check_country($ENV{'REMOTE_ADDR'});
if ($result =~ /^unknown/) {
$host = gethostbyaddr(pack('C4',split(/\./,$ip)),2);
if ($host =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)/) { $result = "unknown"; }
elsif ($host =~ /\.(\w+)$/) {
$result = $1;
$result =~ y/a-z/A-Z/;
}
}
if ($result ne "JP") { &error("エラー","あなたの回線(IPアドレス)が日本国外からである、
または確認が出来ないため、投稿が出来ません。"); }
英字のみの投稿を規制する
リンクのみが投稿されるスパムが横行しているようです。外国からと思いIPアドレス調査してみると、どうも外国とは限らないようなので、
日本以外のIPアドレスを制限しても無駄でした。とりあえず、日本語が書かれていない(日本語コードが検知できない)場合に投稿できないようにする簡単な方法をご案内します。
jcode.plを利用し、文字コードを判定するものです。半角文字だけであれば全角コードは検知されません。
プログラムによりチェックしたい変数名は異なりますので、掲示板であれば内容文などが入っている変数に読み替えてください。
ここでは $LINE にチェックしたいデータが入っているものとします。また、エラー処理は &error(); だと仮定しますので、そのプログラムで使われている方法に書き換えてください。
プログラムやデータをEUCで扱っている場合は euc が含まれるかどうかに変更してください。ここでは sjis が検知できない場合にエラー処理します。
if (&chkZenkaku($LINE) ne 'sjis') { &error("エラー","内容文に日本語コードが検知できませんでした。"); }
sub chkZenkaku
{
local($line) = @_;
(@line) = &jcode'getcode(*line);
$line[1];
}
|