サイトメニュー 掲示板スパム対策

このページから読み始めると「スパム対策は難しい」と誤解されるおそれがありますので
このページには直接リンクをしないで下さい。リンクはトップページ
http://antispam-bbs.xii.jp/index.html
にお願いします。

ここでは比較的簡単で効果の大きいスパム投稿対策の改造例を具体的な改造例を挙げてご説明します。レンタル掲示板などを利用していて、掲示板を改造できないという方も掲示板へのリンクを工夫する等で対策をすることができますので、決して諦めないで下さい。

なお当サイトで公開しているスパム対策改造版スクリプトを利用できる方は、下記のような改造の必用は一切なく、スクリプトを入れ替えるだけで簡単に強力なスパム対策をすることができます。左側の「改造版スクリプト配布」よりご使用掲示板の改造スクリプトをダウンロードしてご利用下さい。

 当サイトの改造内容を利用した事によるいかなる損害に対しても、当方では一切の責任を負いません。全て自己責任(At your own risk)でお願い致します。
簡単なスパム投稿対策の改造例 ]
  1. メールアドレスの入力を禁止する
  2. URLの入力を禁止する
  3. URL(http://〜)の複数書き込みを禁止する
  4. 日本語がないメッセージの書き込みを禁止する
  5. 「合い言葉」を設定する
  6. メッセージ内へのURLの書き込みを禁止する
  7. メッセージ・URL欄などへのNGワードの書き込みを禁止する
  8. 掲示板へのリンクを工夫する
  9. 掲示板へ直接アクセスした場合の投稿を禁止する

ほとんどの掲示板ではメールアドレスの入力を任意にしており、一部の掲示板では入力を必須にしています。そのため、スパム投稿では全ての掲示板に書き込みできるようにメールアドレスを必ず入力するという傾向があります。そこでこれを逆手に取り、メールアドレスを入力した場合には投稿できないようにしておくことで、スパム投稿は簡単に排除することができます。ただし、このように入力を禁止した場合には一般のユーザーの方に周知する必用がありますので、必ず「メールアドレスを書き込まない」旨注意書きを書いておきましょう。

【メールアドレス入力を禁止の改造例】
掲示板スクリプトから、たとえば下記のようなメールアドレス入力のフォームを探し出します。

<td nowrap><b>Eメール</b></td>
<td><input type="text" name="email" size="28" value="$ceml"></td>

ここを次のように赤文字部分を書き加え、value=の値を消しておきます。

<td nowrap><b>Eメール</b></td>
<td><input type="text" name="email" size="28" value=""
<b style='color:#ff0000'>入力禁止</b></td>

次に、メッセージの書き込み処理ルーチンを探し出します。KENT氏のスクリプトでしたら sub regist { 以下が書き込みのサブルーチンになっています。そこに、下記の一行を書き加えます。

if ($in{'email'}) { &error("メールアドレスは入力禁止です"); }

なお、$in{'email'}の部分は、スクリプトによっては異なり、$in{'mail'}、$FORM{'email'}、$FORM{'mail'}、$email、$mailなどであったりします。スクリプト側で使っているメールアドレス変数にあわせてください。

△トップへ戻る

スパムの目的はURLの宣伝です。したがって、URL宣伝のないスパムは存在しません。そこで、上で書いたメールアドレスの入力禁止と同じ方法でURLの入力を禁止します。ごくわずかではありますが、メールアドレスを入力しない例もありますので、こちらもあわせて禁止設定をしておきましょう。

【URL入力を禁止の改造例】
掲示板スクリプトから、たとえば下記のようなメールアドレス入力のフォームを探し出します。

<td nowrap><b>参照先</b></td>
<td><input type="text" name="url" size="50" value="$curl"></td>

ここを次のように赤文字部分を書き加え、value=の値を消しておきます。

<td nowrap><b>参照先</b></td>
<td><input type="text" name="url" size="50" value="">
<b style='color:#ff0000'>入力禁止</b></td>

次に、メッセージの書き込み処理ルーチンを探し出します。KENT氏のスクリプトでしたら sub regist { 以下が書き込みのサブルーチンになっています。そこに、下記の一行を書き加えます。

if ($in{'url'}) { &error("URLの入力は禁止です"); }

なお、$in{'url'}の部分は、スクリプトによっては異なる場合があります($FORM{'url'}、$urlなど)。URLに使っている変数にあわせてください。

上記のメールアドレスやURLの入力禁止では、完全には入力欄を消してしまわないようにしましょう。確かに見た目は良くありませんが、入力禁止の入力欄をあえて残しておくことが重要なのです。どうしても見栄えが良くないので見えないようにしたいという方は、スタイルシートのdisplay:noneを使うことによって非表示にはできます(当サイト配布のスクリプトで採用しています)。

なお、当サイトで配布している改造スクリプトではe-mailとURLの入力を必須としても、スパム投稿を排除することができます。e-mailとURLの入力を禁止する掲示板と入力を義務づける掲示板が混在していれば、画一的なスパム投稿は不可能になります。

△トップへ戻る

何と言っても、http://〜をずらずらと書かれるスパムは迷惑です。そこで、http://〜を多数書き込んだ場合に投稿を拒否することを考えます。下記のようにしてコメント内のURL(http://〜)数をカウントし、$urlnumに入力します。

$urlnum = ($in{'comment'} =~ s/http/http/ig);
if ($urlnum >= 10) { &error("URLの多数書き込みは禁止です"); }

とすると、URL(http://〜)が10以上の書き込みを拒否することができます。なお、$in{'comment'}およびcommentの部分はスクリプトによって異なる場合があります($in{'message'}、$FORM{'comment'}、$FORM{'message'}、$comment、$messageなど)ので、ご利用スクリプトをご確認下さい。なお、この機能は当改造スクリプトに組み込み済みです。

(補足説明)
$urlnum = ($in{'comment'} =~ s/http/http/ig);
の最後にある ig に関して、とある掲示板で「typo(間違い)だ」という誤解がありましたので補足説明します。
この「i」は大文字・小文字を区別せずにマッチングすることを意味します。つまりhttpでもHttpでもHTTPでも同一と見なします。「i」がない場合には、HTTP://・・・とたくさん書き込まれてもマッチしないため、拒否できません。
「g」は繰り返しマッチングします。「g」がないと繰り返しマッチングをせず、1つでもマッチするとそれで処理を終えてしまいますので、http://が複数書き込まれていても1個としかカウントされません。

△トップへ戻る

英文スパムのほとんどは、メッセージに日本語がありませんでした。ただ、最近は日本語の挨拶文や名前、タイトルを使って書き込むスパムも多くなっています。日本語の有無だけではスパム排除は難しくなっています。まずは日本語のない書き込みを禁止します。

if ($in{'comment'} !~ /(\x82[\x9F-\xF2])|(\x83[\x40-\x96])/) {
&error("日本語を書いてください。");
}

とすると、ひらがな(\x82[\x9F-\xF2])あるいはカタカナ(\x83[\x40-\x96])が含まれていない書き込みを拒否することができます。

ひらがなを記述するスパムも存在しますので、この対策だけでは不十分です。さらに

my @period = ("、",",","。",".");
my $flag = 0;
foreach (@period ) { if ($in{'comment'} =~ /$_/) {$flag = 1; last;} }
if (!$flag) { &error("句読点を書いてください。"); }

とした方が効果的です。なお、$in{'comment'}およびcommentの部分はスクリプトによって異なる場合があります。

△トップへ戻る

投稿削除のパスワード(暗証キー)とは別に、「合い言葉」を入力するように設定(入力必須)しておきます。「合い言葉」が一致しない場合には投稿を許可しないようにします。この「合い言葉」は一般ユーザーの方がすぐにわかるように、掲示板かサイトトップページの目立つところに書いておきます。また、「合い言葉」は2バイト文字(いわゆる全角文字)を設定しておけば、日本語を表示・入力できないプログラム(外国)からのスパムは100%排除することができます。さらに、単に「合い言葉」を書いておいて入力してもらうのではなく『合い言葉には「○×△」をひらがなで書いて下さい』のように間接的に指定しておいたり、「合い言葉」や「合い言葉」のヒントを画像で表示しておくと、プログラム投稿は完全に排除できます。

【「合い言葉」設定の改造例】
掲示板スクリプトの最初の部分(か設定ファイル)でたとえば下記のような「合い言葉」を設定しておきます。

$aikotoba = "ほげほげ";

次に投稿者名の入力のフォームを探し出し、その下あたりに下記のように書き加えます。

<tr>
<td nowrap><b>おなまえ</b></td>
<td><input type="text" name="name" size="28" value="$cnam"></td>
</tr>
<tr>
<td nowrap><b>合い言葉</b></td>
<td><input type="text" name="aikotoba" size="10" value="$caikotoba">
<b>合い言葉には $aikotoba と入力して下さい。</b></td>
</tr>

メッセージの書き込み処理ルーチンに、下記のようなこの合い言葉のチェックを書き加えます。

if ($in{'aikotoba'} ne "$aikotoba") { &error("合い言葉が正しくありません。"); }

最後にクッキーの設定を変更します。KENT氏のスクリプトですと &set_cookie という文字を検索すると、下記のようなクッキーの設定プログラムがありますので、

&set_cookie($in{'name'},$in{'email'},$in{'url'},$in{'pwd'});

これを下記のように書き換えます。

&set_cookie($in{'name'},$in{'email'},$in{'url'},$in{'pwd'},$in{'aikotoba'});

これでクッキーに合い言葉が保存されます。次にクッキーを読み出す部分を変更します。KENT氏のスクリプトは大抵 &get_cookie になっていますので、この語句を探すと良いでしょう。

# クッキー取得
local($cnam,$ceml,$curl,$cpwd) = &get_cookie;

このようなクッキー取得プログラムが見つかったら、下記のようにクッキーの合い言葉を取り出すように追加変更します。

# クッキー取得
local($cnam,$ceml,$curl,$cpwd,$caikotoba) = &get_cookie;

△トップへ戻る

これは強力です。スパム投稿の目的はURLを大量に書き込み宣伝することですから、スパム投稿にはURLが必ずあります。URLの書き込みを禁止するとスパム投稿は完全に排除できます。しかしURLを貼れないとなると普通の投稿もで非常に不便ですよね。そこでURLを書き込みたいときにはhttp://〜と記述しないで、ttp://〜などと書いてもらうようにしておき、cgi内で変換して表示するようにすると良いでしょう。この記述方式も一律ではなて、掲示板によってさまざまな方式があることが望ましいです。

【URL入力の禁止改造例】
メッセージの入力のフォームを探し出し、そこに下記のように注意書き(赤文字部分)を書き加えます。

<tr>
<td colspan="2" nowrap><b>メッセージ【メッセージ内のURLは先頭のhを抜いて書き込んで下さい。】</b></td>
<td><textarea name="comment" cols="56" rows="7" wrap="soft"></textarea>
</tr>

次に、書き込み処理ルーチンに下記のようなチェック行を書き加えます。

if ($in{'comment'} =~ /http\:\/\//i) { &error("URLの直接入力は禁止です。"); }

自動リンク(たとえば、sub auto_link )があれば、こそを下記のように変更します。下記は ttp://〜 と書かれたURLを http://〜 に変換して自動リンクするスクリプトの例です。

$_[0] =~ s/([^=^\"]|^)(ttps?\:[\w\.\~\-\/\?\&\=\@\;\#\:\%\,]+)/$1<a href=\"h$2\" target=\"_blank\">h$2<\/a>/g;

△トップへ戻る

NGワードを設定して、特定の語句やサイトの宣伝を禁止させる方法です。当サイトで配布しているNGワードデータをそのまま利用する方法を記述しておきますが、NGワードデータを書き換えることでNGワードの設定は自由に変更できます。

【NGワード設定の改造例】
設定項目で下記のようにNGワードデータファイルを定義します。spamdata.cgiはNGワードデータファイルです。他の名称でもかまいません。/data/の部分はNGワードデータファイル(spamdata.cgi)を転送するディレクトリです。
$spamdata = './data/spamdata.cgi';
ここでは、spamdata.cgiファイル内にNGワードを半角のカンマで区切って登録している例を示します。
次に、書き込み処理ルーチンに下記のようなチェック行を書き加えます。

    ($flag,$reason) = &spam_check($comment,$name,$url,$email,$subject);
    if ($flag)  { &error("$reasonため投稿できません。"); }

$comment,$name,$url,$email,$subjectの部分はそれぞれ、書き込み内容、名前、URL、メールアドレス、標題です。また、&errorはエラー表示ルーチンを表します。この変数部分は、ご利用スクリプトにあわせて変更して下さい。

そしてスクリプトの任意の場所(最後の方)に下記のNGワードチェックルーチンを追加します。

#-------------------------------------------------
#  NGワードチェック
#-------------------------------------------------
sub spam_check{
  my ($cm,$na,$ur,$em,$sb) = @_;
  my $flag = 0;
  my $reason = '';
  if (-e $spamdata) {
    # 禁止URLデータをロード
    open(SPAM,"$spamdata");
    my $SPM = <SPAM>;
    close(SPAM);
    # 禁止URLの書き込みをチェック
    foreach (split(/\,/, $SPM)) {
      if(length($_) > 1) {
        if ($cm =~ /\Q$_\E/i) {
          $flag = 1; $reason = "名前/コメント内に禁止語句$_を含む"; last; }
        if (!$flag && $na =~ /\Q$_\E/i) {
          $flag = 1; $reason = "名前/コメント内に禁止語句$_を含む"; last; }
        if (!$flag && $ur =~ /\Q$_\E/i) {
          $flag = 1; $reason = "URLに禁止語句$_を含む"; last; }
        if (!$flag && $em =~ /\Q$_\E/i) {
          $flag = 1; $reason = "メールアドレスに禁止語句$_を含む"; last; }
        if (!$flag && $sb =~ /\Q$_\E/i) {
          $flag = 1; $reason = "タイトルに禁止語句$_を含む"; last; }
      }
    }
  }
  return ($flag,$reason);
}

△トップへ戻る

レンタル掲示板などを利用しているため改造ができない場合でも対策は可能です。一つはレンタル元のサービス会社にスパム対策を依頼することです。また、当改造スクリプトの採用も可能です(スリーエスサービスのようにスパム対策済みスクリプトを採用しているレンタルサービスもあります)ので、希望される方は掲示板レンタル会社の方へ依頼して下さい(当方に依頼されても対応はできません)。利用者の皆さんからの要望が多ければ採用されるでしょう。

もう一つの対策は掲示板へのリンク方法を工夫することです。スパム投稿対策に消極的なレンタルサービスがあることも事実です。改造スクリプトの導入をお願いしても採用されない場合には新たに掲示板を取得して、掲示板へのリンク方法を変更することでスパム対策をします。

当方が管理している掲示板には掲示板スパムがほとんどありません。少なくとも3年以上前からゼロ件です。これはCGIのファイル名を一般的な名称から変更しているのに加え、トップページから掲示板へのリンクをJavaScrip表示にしているため、検索プログラムでリンクを辿って掲示板へ行けなかったり、掲示板のURLが収集されにくくなっていると考えられます。掲示板(CGI)の名称を変更した場合やスパム投稿のひどいレンタル掲示板の利用をやめて新たに掲示板を設置する場合には、アドレスを変更するだけではなくリンクをJavaScriptで記述してきましょう。

リンクをJavaScriptで記述する方法はこちらに詳しく書いてありますが、こちらに、簡単に掲示板URLのJavaScript表示用できるようプログラムを用意しました。掲示板URLを変更し、このjavascript表示を利用することで掲示板の種類によらずスパム投稿を防ぐことができます。

掲示板URLの簡単javascript表示へ

もう一つ、Javascriptファイルを作成してそれを参照する方法をご説明します。たとえば掲示板URL(アドレス)が"http://www.example.com/cgi-bin/bbs.cgi"であるとします。通常のリンク表示ですと、
<A HREF="http://www.example.com/cgi-bin/bbs.cgi">掲示板</A>
とhtmlファイルに記述していると思います。これをJavaScript表示に変更します。まずは新規のテキストファイルを作成します。とりあえずファイル名は何でもかまいません。そのファイルに、

url="掲示板";
document.write(url.link("http://www.example.com/cgi-bin/bbs.cgi"));

とだけ記述します。もちろん、http://www.example.com/cgi-bin/bbs.cgiの部分はご自身の掲示板アドレスを記述し、「掲示板」の部分も適当に変更します。このファイルを、たとえばbbsaddress.jsというファイル名に変更して保存します。Javascriptファイルと察知されないようにbbsa@ddress.jsのようにアットマークを入れておくのも良いです。次に、ホームページのhtmlファイルに、

<A HREF="http://www.example.com/cgi-bin/bbs.cgi">掲示板</A>

と記述している掲示板へのリンク部分を

<script type="text/javascript" src="bbsaddress.js"></script>

と書きます。bbsaddress.jsの部分は先ほどのファイル名を同じくしておきます(アットマークを入れた場合には、こちらでも入れておく)。そして、このホームページhtmlファイルの上部ヘッダ部分(<head> 〜 </head>の間、<meta・・・と記述してある部分)に下記のメタタグ
<meta http-equiv="Content-Script-Type" content="text/javascript">
を追加し、ホームページのhtmlファイル内でJavaScriptを使用することを宣言しておきます。このMETAタグを書いていないとJavaScriptを利用できません。さらに、ホームページhtmlファイルには「掲示板へアクセスするにはJavaScriptを有効にして下さい」と記述しておくと良いでしょう。最後に、ホームページhtmlファイルとbbsaddress.jsファイルをサーバ側に転送して完了です。

なお、掲示板をフレーム内に表示している場合にはBASEタグを使います。詳しくはこちらをご覧下さい

それと、掲示板のヘッダーに

<meta name="ROBOTS" content="NOINDEX,NOFOLLOW">

を書き加えておき、Google等の検索サイトに掲示板のアドレスが掲載されないようにしておきましょう。

また、JavaScriptを使ったリンク制限として、「document.referrer.indexOf」があります。これは指許可しているURL以外からのリンクを弾くJavaScriptで、実際にこのページにも利用しております(このページURLをブラウザのURL欄に入力して直接開こうとするとトップページへ飛ばされます)。 document.referrer.indexOfの使用方法はこちらを参考にしてみて下さい。先ほどのJavaScriptでのリンク記述と併用すると、JavaScriptがONなら直接不正な書き込みをできなく、JavaScriptをOFFにすると掲示板自体にアクセスできなくなり、ブラウザ以外からの不正な書き込みやアクセスをシャットアウトできます。

JavaScriptでリンクを表示した場合には携帯からアクセスできないことがあります。そこでQRコード(2次元バーコード)を使って携帯からも簡単にアクセスできるように工夫します。掲示板URLをQRコードで表示しておき、携帯からアクセスする場合にはこのコードを読み取ってもらうようにします。QRコードの作成には、たとえば、Psytec(サイテック)フリーソフト 『QRコードエディタ』を利用します。これを使うとURLをQRコードに、あるいは逆にQRコードをURLに戻すこともできます。

リンク方法の変更でスパム対策をできるのは、新たに掲示板を設置した場合に限られます。既にスパム投稿がひどい掲示板には効果がありません。

普通の投稿者はトップページから掲示板にアクセスして投稿します。しかし、スパム投稿は掲示板のURLリストだけを使い、掲示板に直接アクセスして投稿をします。そこでこのように直接掲示板にアクセスした場合には投稿をできなくすることで、スパム投稿をさせなくすることができます

掲示板への直接アクセスを禁止する場合には
if (!$ENV{'HTTP_REFERER'}) {
&error("掲示板への直接アクセスは禁止されています。");
}
をホスト名取得ルーチンやアクセスチェックなどのスクリプト中で最初に実行するルーチンに書き込みます。

このようにプログラムによる自動投稿を排除するためには、さまざまな設定の掲示板が混在する状態が望ましく、ユニークな設定の掲示板であればあるほど、スパム投稿されにくいことになります。