phpBB3/英文スパム対策

最近phpBB3をインストールする仕事があった。
公開してしばらくしたらスパム投稿が非常に多い。

設置したサイトでは、ユーザー登録していなくても投稿できる仕様で標準で文字認証機能があるのでそれはONにしている。

だけども文字認証なんて飾りだね。英文スパムはそんなの簡単に抜けてバンバン投稿してくる。

いろいろ調べたら英文スパムを投稿禁止するカスタマイズ方法が載っているブログをいくつか見つけた。


modと呼ばれるモジュール?プラグインみたいなものを入れて対策する方法もあるようだがいろいろ調べてもよくわからない。

で行き着いた先が↓こちらのやり方。
禁止ワード設定と英語のみ禁止でspam投稿対策
http://garnote.com/2010/01/spam.html

posting.phpにmessageが英文のみだったら投稿できなくするという仕組みだ。

この方法で実装してみると、かなり減った。

かなり減ったんだけど、英文スパムも経験値が高く本文に日本語を含んで送信してくる奴がある。

 ただ、こいつらもタイトルだけは英文で送ってくるしかないらしく、ちょいとカスタマイズしたら、ほぼ100%スパムがなくなった。

220行目あたりかな?
  // Permission to do the action asked?
$is_authed = false;
↑この下に以下を追記する。
/*** 英文スパム対策ここから*******************************************************/
$chkmsg = ( !empty($_POST['message']) ) ? $_POST['message'] : '';
$chksubject = ( !empty($_POST['subject']) ) ? $_POST['subject'] : '';
//英語のみ禁止チェック
$chkresult =((mb_detect_encoding($chkmsg, "auto") == 'ASCII')&&(strlen($chkmsg) != 0));
$chkresult_sub =((mb_detect_encoding($chksubject, "auto") == 'ASCII')&&(strlen($chksubject) != 0));

//禁止ワードを"chkword.txt"から読み込む
$chkword = @file("./chkword.txt");foreach ($chkword as $line) {
    $line = str_replace("\r", "" , $line);$line = str_replace("\n", "" , $line);
    if (substr_count($chkmsg, $line)) { $chkresult = true; }
}

if ($chkresult or $chkresult_sub) {
    trigger_error('
投稿エラー
件名と本文に日本語が含まれていない場合は投稿できません。
もしくは、投稿禁止ワードが含まれている可能性があります。
どうしても投稿ができない場合は、お問い合わせください。一つ前の画面へ戻る');
}
/*** 英文スパム対策ここまで *******************************************************/

↓この上。
switch ($mode)
{
    case 'post':
        if ($auth->acl_get('f_post', $forum_id))
        {
            $is_authed = true;
        }
    break;



 いずれタイトルにも日本語が入ってきたら正直防げないであろう。

他にはhtaccessで国外からのIPアドレスを受け付けない設定にするなど方法はあるのでまたスパムが増えたら考えよう。


追記:2012-04-06

上で書いた対策は英語スパムに対してはほぼ無くなったんだけどしばらくしたらロシア語らしきスパムが入るようになってきた。
 調べたら同じような方も居て、↓こんな対策していたのでお知恵拝借させていただきました。
http://hkitago.com/2012/01/phpbb%E3%81%AE%E3%82%B9%E3%83%91%E3%83%A0%E6%8A%95%E7%A8%BF%E5%AF%BE%E7%AD%96/

変更点は以下のように。
------------以下引用
//英語のみ禁止チェック
//$chkresult = ((mb_detect_encoding($chkmsg, "auto") == 'ASCII') && (strlen($chkmsg) != 0));
$chkresult = ((!preg_match('/[一-龠]+|[ぁ-んー]+/u', $chkmsg)) && (strlen($chkmsg) != 0));
 -------------

 英語を判定するのではなくって、日本語が含まれているかどうかのチェックってことなのかな。


追記:2013-01-27

結局上記での対策で運用継続して現在に至るが、スパムは減ったものの英語+意味のわからない日本語が混ざっていたりする投稿はどうしても弾くことができない。
これは仕方がないので投稿を監視して手作業で削除を実施している。


コメント

  1. phpBB3というのは利用したことはないんだけど、
    スパム対策でよく使われるのは以下かなあ。
    ・hiddenでパラメータを渡す
    ・Javascriptで投稿画面を表示する
    ・Javascriptで投稿URLを書き換える
    http://www.sound-uz.jp/php/note/spampost

    全くphpBBにあてはまらなかったらごめん

    返信削除
  2. 情報39!
    Javascriptで投稿画面を表示するってのは意外だった。

    返信削除
  3. 素晴らしい記事、共有するためのありがとう!

    返信削除

コメントを投稿

人気の投稿