純規の暇人趣味ブログ

首を突っ込んで足を洗う

phpbbのスパム対策を考えてみる

      2016/03/06    HimaJyun

ちょっとしたコミュニティなどで良く使われている「phpbb」なる掲示板があるのですが、
個人規模でも良く使われているからか、スパマーに狙われやすいです。

どこにでも良くある「ありきたりな手法」を施すだけで劇的に改善する事が出来るため、その「ありきたりな手法」をまとめてみました。

phpbbでスパム対策

僕がマイクラ鯖用に動かしているphpbbではスパム投稿なんて食らった事無いのですが、phpbbで掲示板を動かしているとどうにも海外からのスパムが相次ぐようです。

単に疎開だからなのか、スパム対策が効いているからなのか分かりませんが、僕がphpbbで行っているスパム対策をご紹介しようと思います。

phpbbのバージョンはこの記事を書いた時点(2016/03/06)で3.1.8です。
利用している言語ファイルによって微妙に表現が違うかもです。

明らかにおかしい投稿を拒否

掲示板に投稿されるにしてはおかし過ぎる投稿(本文が空、日本語を一切含んでいない)を投稿できない様にしてしまいましょう。

それでも投稿して来る奴(と、言葉遣いの悪いオコチャマ)への対策も兼ねて禁止ワードも設定出来る様にしておくと良いと思います。

ルートにある「postion.php」を少し改造する必要がありますが、超簡単ですしユーザが利用する限りは影響が極小なので試してみる価値ありです。

postiong.phpを開いて、300行前後にある「$is_authed = false;」から「switch ($mode)」の間に以下のコードを追加します。
(見つからない時は「switch ($mode)」とか「$is_authed = false;」でテキスト内を検索ですよ)

$chkmsg = request_var('message','',true);
$chksubject = request_var('subject','',true);

$chkresult = ((!preg_match('/[一-龠]+|[ぁ-んー]+|[ァ-ン]+/u', $chkmsg)) && (strlen($chkmsg) != 0));
$chkresult_sub = ((!preg_match('/[一-龠]+|[ぁ-んー]+|[ァ-ン]+/u', $chksubject)) && (strlen($chksubject) != 0));
$chkword = file_exists('chkword.txt') ? file('chkword.txt') : array() ;
foreach ($chkword as $line) {
  $line = str_replace(array("\r", "\n"), '', $line);
  if (strpos($chkmsg, $line) !== FALSE || strpos($chksubject, $line) !== FALSE) {
    $wordchk = true;
  }
}

if ($chkresult || $chkresult_sub) {
  trigger_error('
    投稿エラー
    日本語を含まない文章は投稿できません。
    <a href="javascript:history.back()">前の画面に戻る</a>
  ');
} else if ($wordchk) {
  trigger_error('
    投稿エラー
    投稿に禁止されている言葉が含まれています。
    <a href="javascript:history.back()">前の画面に戻る</a>
  ');
}

「良く分からない物使うの怖い」なあなたのために軽く説明すると、日本語(漢字、ひらがな、カタカナ)を含まない投稿や、本文が空の投稿、予め設定した禁止ワードが含まれている投稿を拒否します。

禁止ワードはルートに「chkword.txt」と言うファイルを作成して1行に1つずつ書き加えて行けばいいです。

Capture認証を取り入れる

AdminCP->Captureの設定を開いて、「ユーザー登録の際に CAPTCHA を行う」、「ゲストに対して CAPTCHA を行う」、を有効にしましょう。

Captureプラグインは色々ありますが、デフォルトで入っている物から選ぶとしたらreCaptureかQ&A、個人的にはQ&Aが手軽で強力なのでおススメです。

多くの場合は日本人しか利用しない掲示板だと思います、日本人にしか分からない様な質問、そして、日本人なら必ず分かる様な質問を投げかけてやれば良いと思います。(例:「いちたすいちは?[数字:1文字]」、「邪馬台国の女王は?[3文字]」など)

こうする事で少なくとも、Captureをすり抜けないと投稿できない様になります。

ゲストの投稿を制限する

さて、スパマーの気持ちになって考えてみましょう。

目の前に「ユーザ登録必須の掲示板」と「ユーザ登録の必要ない掲示板」の二種類があります。
それでは、どちらを荒らしますか?

普通であれば、ユーザ登録の必要のない掲示板の方が楽ですし、そちらを荒らしますね。

phpbbを使うと言う事は、多くの場合はコミュニティとかで使っていると思うので登録必須にしてしまうと言う手もあります。

もし、ゲストの投稿を許可するのであっても、連投制限などをきつ~く設定しておいた方が良いです。

メアド認証を有効にする

登録必須でも登録がユルユルだと無意味です。
かと言ってキツ過ぎると生身の人間すら使えなくなってしまいます。

とは言え、この項目は先程のCaptureで一緒に対策出来てしまうので構わないかと思います。

しかし、登録時のメール認証は必須にしておいた方が良いと思います。

ユーザ登録の設定ページへ行き、「アカウントの有効化」を「ユーザー」に切り替えれば良いです。
特別な理由でも無い限りは「メールアドレスの再使用」は「いいえ」にしておくべきです。

なぜメール認証が必要か?、スパム対策?、いえいえ、スパマーはメールのリンクをクリックしてアカウントを有効化してくるっぽいですよ
だったら何か、生身の人間対策です。

生身の人間が「他人のメアドを登録」なんて事が出来てしまうと、赤の他人に嫌がらせが出来てしまうある種の「脆弱な掲示板」になってしまいます。

仮に悪意はないとしても、タイプミスしたメアドがそのまま他人のアドレスだったり……ってのもあり得ますし、メールが不通なのに気付かなくて連絡が付かない、ってのも困ります。

メールが送信出来るサーバが必要になって来ますが、今頃の大抵のサーバだとメールくらいは送信出来ると思われます。
出来る事ならやっておくべきでしょう。

まとめ

スパマーはさっさとタヒんで下さい、どうぞあの手この手でスパムを投稿して行こうとします。
とは言え、所詮botはbot、用意されたプログラム(アルゴリズム)に沿って特定の動きをしているに過ぎません

そのパターンを見つけ出して潰せば良い話ですし、この様な類の記事で投稿された「ありきたりな手法」すら回避出来ないのがプログラムです。

プログラムに自ら考える能力は(今の所)ありません、ちょっと手を加えてやるだけで一網打尽に出来るでしょう。

 - サーバ運営