掲示板等にアクセス制限

 掲示板やチャットなどに荒らし書き込みや宣伝書き込みがひどく、困っている方も少なくないと思います。かく言う僕も、最近掲示板への宣伝書き込みで困っていました。それでは、掲示板などに書き込み制限をかける簡単な方法についてご説明しましょう。

相手のホスト情報を確認する

 うちで公開している掲示板等のスクリプトには、新規書き込みの処理部分に接続して来た人のホスト情報を取得する処理が盛り込まれています。次のような処理部分です。

//ホスト名を取得
$host = getenv("REMOTE_HOST");
$addr = getenv("REMOTE_ADDR");
if($host == "" || $host == $addr){
 $host = gethostbyaddr($addr);
}

これにより書き込み者のホスト情報が取得できますので、これを元にPHPの正規表現関数を使って書き込み処理の仕分けを行います。ただし、ホスト名が取得できず、IP番号がログに残っている場合は、このアクセス制限は使えないかも?

正規表現関数 preg_match()

 ここで使う正規表現関数 preg_match()関数についてご説明します。

preg_match()関数

int preg_match ( string pattern, string subject [ , array matches ] )

引数pattern で指定した正規表現により、引数subject で指定した文字列を検索します。引数matches が指定された場合、検索結果が代入されます。引数subject に引数pattern がマッチした場合はtrueを返し、マッチしなかったか、エラーを発生した場合にfalseを返します。

実際の処理

 それでは実際の処理コードについてご説明しましょう。pattern 部分に埋め込むホスト情報については少し注意が必要です。「***.ne.jp」とか「***.net」とか、ホスト情報の主要部分のみを埋め込むと、そのプロバイダに加入している人全てに書き込み制限がかかるようになりますので、できるだけこれら主要部分の前に付いている接続の地域情報なども盛り込むようにしましょう。少しでも相手を絞り込むようにします。

例:west.flets.***.ne.jp …赤色部分

 実際には、上記の書き込み処理の部分のホスト名取得処理のコードの次に、以下の処理コードを埋め込みます。

//ホスト名を取得
$host = getenv("REMOTE_HOST");
$addr = getenv("REMOTE_ADDR");
if($host == "" || $host == $addr){
 $host = gethostbyaddr($addr);
}

//アクセス制限をかける
if(preg_match("/
制限をかけるホスト情報 /i", $host)){
 echo "<FONT COLOR='red'>注意…あなたがご利用のプロバイダの会員の方で、当サイトに不正書き込みをされる方がいる為、書き込み制限を設けさせて頂いています。ご了承下さい。</FONT>\n";
 exit;
}

…「i」は大文字・小文字を区別しないと言う意味です。

これで書き込み者のホスト情報が制限をかけたいホスト情報にマッチした場合、お断りの文面を表示して後の処理を全て抜けます(exit;)。つまり、制限をかけられた相手は、ログへの新規書き込みが出来ない訳です。

荒らし書き込みがもっと酷い場合

 最初は相手のホスト情報でアクセス制限をかけていても、荒らし書き込みがもっと酷くなって来ると、相手のホスト情報だけでは対応が全く追い付かない事態になってしまいます。特に英語圏からの荒らし書き込みの場合、結構ホストをどんどん変えて来るので、終いに全く手がつけられなくなることもしばしばです。

 こんな場合は、コメントの内容にアクセス制限をかけるようにすると割と便利です。つまり書き込み制限をかけるキーワードをどんどん決めて行く訳です。コード内容としては、以下のようになります。

$spam_flag = 0;
//コメントに含まれる文字列で拒否
if(preg_match("/Well done!/i", $comment)){ $spam_flag++; }
if(preg_match("/Good design!/i", $comment)){ $spam_flag++; }
if(preg_match("/
制限をかける文言/i", $comment)){ $spam_flag++; }
・・・・・・・・・・・・・・・・・・・・・・
if($spam_flag > 0){
 echo "<FONT COLOR='red'>注意…当サイトは不正書き込みに対して書き込み制限をかけさせて頂いています。ご了承下さい。</FONT>\n";
 exit;
}

以上のコード内容を新規書き込み処理の中に埋め込みます。うちのサイトも現在はこの方法で不正書き込みを制限しています。意外に効果があるかもね…(^^ゞ

外国からの宣伝書き込みが酷い場合

 最近、外国からの宣伝書き込みで悩まされていませんか。一気に大量に書き込みをして来るので、この被害を受けると正常な掲示板の運営が出来なくなってしまいます。何を隠そう、うちもこの被害にあったサイトの一つです。それで色々考えた結果、これらの迷惑書き込みは全て半角英数のみだと言う事に気が付きました。つまり、日本からの書き込みとの違いが何であるか、強いては日本語による書き込みの特徴が何であるかと言う事に着目すればいいんだと言う事に気付いた訳です。

 日本からの書き込みであれば、必ず平仮名が最低一文字は使われているはずだと思いませんか。まあこれは片仮名でもいいんですが、通常平仮名の方が使用頻度が高いと思います。そこで、コメント内に平仮名を一文字も使っていない書き込みを拒否するコードを考えました。コード内容は以下の通りです。

$spam_flag = 0;
//平仮名を配列に格納
$kana = array("あ","い","う","え","お","か","き","く","け","こ","さ","し","す","せ","そ","た","ち","つ","て",
"と","な","に","ぬ","ね","の","は","ひ","ふ","へ","ほ","ま","み","む","め","も","や","ゆ","よ","ら","り",
"る","れ","ろ","わ","を","ん");
foreach($kana as $obj){ 
←配列変数$kanaの各要素を変数$objに放り込んで行きます。
 if(preg_match("/$obj/", $comment)){
  $spam_flag++; 
←コメント内に平仮名が使われていれば、変数$spam_flagの値をプラスする。
  break;
 }
}

if($spam_flag == 0){ ←判断の基準が今度は逆になっている。
 echo "<FONT COLOR='red'>注意…当サイトは不正書き込みに対して書き込み制限をかけさせて頂いています。ご了承下さい。</FONT>\n";
 exit;
}

以上の処理で、外国からの迷惑宣伝書き込みはシャットアウトできます。何しろ、欧米で売られているパソコンには、日本語の平仮名を打ち込む機能は付いていないはずですから(^.^)

HOME