掲示板spam対策

掲示板だったらフリーのスクリプトや無料で使えるものがたくさんあるのでそれを使っていれば良いのでしょうけど、以前に自作したのをそのまま使い続けています。ですので完全に独自の掲示板なのですが、こんなところにまでspamがよくやってきます。

spamについては前に一時期ひどくなったのでいくつかの対策を入れたところspamを上手くはじくことができるようになったのですが、最近それもすり抜けるものが出てきたのでさらに対策を追加しました。整理のために現在行っている対策を書き出してみます。

方針としては、閲覧者にあまり負担をかけないというのを第一としました。ですので入力の手間を増やすもの、Cookieを必須にする、承認制にするというのは対象外にしています。あと、人手で地道に登録してくるようなものは防ぎようがないとあきらめて、機械的なものをターゲットにしています。

実際に行っている対策は以下の5つです。

  • NGワード
  • リンク先の数の制限
  • メールアドレスの入力値チェック
  • ダミーの入力禁止項目
  • ダミーの必須項目

NGワード

これは分かりやすいですね。この言葉が入っていたらエラーにするという方法。いくつかありますがその中でも以下で引っかかるものが多いです。正規表現で書けるようにしていますが、単純な文字列一致でも効果があります。

\[/LINK\]
\[/url\]
<a href=\s*http

私の所はタグでの修飾には対応していないのでこんな感じでどこかにリンクさせようとしている書式があった場合にエラーにしています。

リンク先の数の制限

タグでの修飾はしていないものの、http://で始まる文字は自動でリンクになるようにするというのは入れているので、これについては単純にエラーにするということはしていません。ただし普通リンク先を書くにしてもせいぜい5個程度なので、あまりにもリンク先が多い場合はエラーにしています。掲示板によっていくつでエラーにするのかは変わると思いますが、私の所では10個以上でエラーにしています。

メールアドレスの入力値チェック

これは簡単です。今ではあまり使われていませんがメールアドレスを入力する欄があります。この欄に入力があってかつ入力値に「@」が含まれていない場合にエラーにしています。意外とこれに引っかかるspamは多いですよ。

メールアドレス入力欄のnameをメールアドレスっぽくしていないので効果が高いのかもしれません。

ダミーの入力禁止項目

ダミーの項目を作って、ここに値があったらエラーにするという方法です。

<input type="checkbox" name="mem" value="1" style="display:none;">

こんな項目を用意してmemに値が設定されていたらエラーにしています。style="display:none;"を入れて、大部分の利用者には余計なものが見えないようにしています。

ダミーの必須項目

ダミーの入力禁止項目と考え方は同じです。ダミーの項目を作って、ここに値がないとエラーにするという方法です。

<input type="checkbox" name="mem2" value="1" checked style="display:none;">

ダミーの項目については、最初は入力禁止項目だけのチェックをやっていてそれなりに効果があったのですが最近すり抜けるものが多くなったので、必須項目も追加したところかなりの効果がありました。これは組み合わせて使うと良いみたいですね。

以上が私が現時点で行っている掲示spam対策です。私はやっていませんが効果がありそうな手法としては以下のものもあるようです。

  • 日本語が一文字も入っていない場合はエラーにする(どうせ日本人しか書き込まないだろうと割り切れる場合)
  • リンクをhttp://ではなくttp://で書いてもらって、http://があったらエラーにする(これは説明が必要でちょっとですが利用者への負担があります)