PHP系の掲示板でマルチバイトを含まない投稿をスパムとして扱う

2006年12月13日 オフ 投稿者: KYO
Table of Contents

ブログや掲示板への国外からのスパムで悩む・・・なんてことが多いと思うんですが。
今回は、PHP系の掲示板限定(Perl互換の正規表現なので流用可能)で、コメントにマルチバイトを含まない場合の排他処理の部分をメモ。
他にもスパム対策として有効な方法はありますが、とりあえず導入が楽なので。

//{{{ checkMultiBitesString() --- マルチバイトの文字列かどうかをチェック
/**
*	マルチバイトの文字列かどうかをチェック
*		@param:		string $string
*		@return:	boolean
*		@access:	public
*/
function checkMultiBitesString($string)
{
/* EUC文字コード */
$ascii = '[\x00-\x7F]'; # 1バイト EUC-JP文字
$twoBytes = '(?:[\x8E\xA1-\xFE][\xA1-\xFE])'; # 2バイト EUC-JP文字
$threeBytes = '(?:\x8F[\xA1-\xFE][\xA1-\xFE])'; # 3バイト EUC-JP文字
/* マルチバイト文字コード */
$character = "($twoBytes|$threeBytes)"; # EUC-JP文字
if(mb_ereg($character, $string)){
return true;
}else{
return false;
}
}
//}}}

あとは、コメントの取得後またはデータ登録の処理前後あたりで

if( !checkMultiBitesString($comment) ){
print "シングルバイトだけです";    // シングルバイトのみだったのでスパムとして扱う
}else{
print "マルチバイトを含んでいます";
}

って感じで処理すればおそらく・・・OK。
あとは、REFERERやコメント内のURLやメールアドレスの扱いも若干変えたほうがいいかもしれません。