[PC] 掲示板プログラム( (SS)-C-BOARD )のスパム対策

Submitted byshin on日, 2009-03-22 18:37
カヌーの掲示板に(SS)C-BOARDという掲示板プログラムを使用しているんだけど、
メジャーな掲示板プログラムにはきちんと自動スパムプログラムが用意されている様で、迷惑投稿や迷惑メール
が良くやってくる。
で、(SS)C-BOARDの標準機能の範囲でいろいろ試行錯誤しては見たんだけど、向こうの想定の範囲らしく
効果が無いし、厳しくしすぎると仲間の投稿が無くなる(Mo田さんの投稿が全く無くなったのであせった)ので、
いろいろ悩んだ結果、「簡単でもいいからオリジナルのスパム対策を入れることが有効」だという結論に至った。

アイデアは極簡単で、掲示板の投稿/匿メールの投稿時に、当日の日付(MMDD)を入力してもらうというもの。
ちなみに、うちの掲示板限定なので、スタイルはaquaのみ/メールは匿メールのみ(直接メールは禁止している)
の制限付き。一般的にやろうとしたらもっと面倒になるはず。

対象のファイルは、4つ
  1. 掲示板の投稿
    1. 投稿画面の定義(style/aqua/psn.txt)

      入力フィールドの最期に"おまじない"を作って、後段のプログラムに、'sessami'というIDで渡す。
    2. 投稿結果のチェック(cmd/pst.pl)

      後段のプログラムは'date'のMMDD部と'sessami'が一致するかどうかを確認する
  2. 匿メールの投稿
    1. 投稿画面の定義(style/aqua/hmn.txt)
      こちらも同じく'sessami'というIDを後段に渡す

    2. 投稿結果のチェック(cmd/hml.pl)

      こちらも同じ‥にしたかったんだけど、'date'が無かったので、ライブラリを呼び出す形で日付を 取得して、'sessami'と一致するかを確認する

で、1ヶ月位経ったけど、スパムが全然来ない。すばらしい(なんて事を書くとまた来るかもしれない)

SPAMが沢山書き込まれ、その都度メンテナンス削除していたのですが、さすがにそろそろ何とかしたい、と検索をして、こちらにたどり着きました。

(SS)C-BOARD は開発が止まりましたし、有志によるその先のバージョンに乗せかえるには作業負担が大きいし、簡単にSPAMブロックする方法はないか、と考えていたので、こちらの情報はとても助かりました。

えぇと示されているディレクトリとその下の画像ファイルが一致していません。一瞬、どれを修正したら良いのか悩んでしまいました。

でも、とても助かりました。
ありがとうございます。

欲を言えば、画像で示された修正点を、コピー&ペーストできるよう、テキストでも表示してくださったらとても助かりました。
画面見ながら、自分で入力するのは、若干画像が見難いために、入力間違いするんじゃないかと不安でした。
無事に動いて、テストをクリアして、ほっとしました。

さぁ、これでSPAM、排除できるかな?

あれ?確かに画像がずれてますね。
とりあえず、本文のファイル名と画像を合わせてみました
# 本文が間違えていたらどうしよう…

画像にしたのは、cut&pasteしやすい形態だとスパム作成者の便宜を図ることにならないか?という危惧からでした。結果として、GOさんに不便をかけてしまうことになり、申し訳なかったです。

ところで、この修正、別の記事に書いてあるように、スパムプログラムが対応したらしくて、スパム投稿が再び増えてきたので、更に対策をしています。
修正内容に興味があれば、メールしますよ。(gmailのメールでいいんですよね?)

確かにカット&ペーストできるのは、それはそれでまずいかもしれませんね。
不便だと思っても必要に迫られていればがんばるわけですから、困っているならその程度の自助努力をするのもやむなしではあります。
事実僕は、情報を頂けたことがとても助かりました。

お返事を拝見して、最近の記事を見つけました。
敵もさるものですね…

確かにどうにもならなければ C-BOARD Moyuku への移行を考えるのですが、ちょっと負担大きそうで躊躇しています。

もしできれば、修正内容を教えていただけますでしょうか。
登録の gmail でご連絡いただけたら。

ありがとうございます。

パラメータを追加し題名欄の下にプロフィール欄を設けたのですが、
投稿画面よりプロフィールを入力すると以下のようなエラー表示が出るのです。
ERROR:プロフィールが長すぎます。文字以内にしてください。

自分自身でも調べてみたのですが、本来は、を記入してください。のエラー表示が出ると思うのです。

/cmd/pst.plの中にある
my $item;
foreach $item (keys %item) {
#── 長さをチェック
if ($::FORM{$item} =~ /^(?: | |\n)*$/s) {
$CNF::post{$item}{'indispensable'}
&& push(@error, "$item{$item}を記入してください。");
}
(length($::FORM{$item}) > $CNF::post{$item}{'max'})
&& push(@error,
("$item{$item}が長すぎます。$CNF::post{$item}{'max'}"
. "文字以内にしてください。"));

パラメータはopt_prfにしていますが何が原因なのか心当たりなどありましたら
ご指導お願いできませんでしょうか

何分不慣れな者ですから/cmd/pst.plの中にあるものを以下のように編集したのですが

sub check_parameter {
# もろもろの事情により(?)SJISであることをそれほど意識せずに
# 処理しています
require './lib/htm.pl';
my @error;
my %item = qw(
name 名前 email メールアドレス subject 題名 opt_prf プロフール body 本文 key パスワード
web ホームページアドレス
);

掲示板のURLも添付していますので何卒よろしくお願い致します。

失礼致します。

高田

cc-boardレベルのスクリプトをメンテナンス(ちょいハッキングはできるのですが‥)するレベルに無いのですが、聞かれてしまったので雰囲気で答えてしまいます(^^;

「"‥を記入してください"が表示されずに"‥が長すぎます"」が問題というのは、
(1)if ($::FORM($item)... が実行されてないっぽい
(2)入力が十分短いのに (length($$::FORM)....のチェックに引っかかってしまう
の2点が問題ということでしょうか?

ソースを眺めると、それぞれのパラメータ(最大長等)は、cmd\stp.plで定義しているっぽいですよね。opt_prfはcmd\stp.plに定義済みでしょうか?
もし定義していないとしたら、
(1) $CNF::post{$item}{'indispensable'}が定義されていないので、偽になって、&&以降の push(@error,"...を記入してください");が評価されない
(2) post{'opt_prf'}{'max'} が定義されていないので、何を入れても長さエラーになってしまう
のではないかと思うのですが違うでしょうか?

違っていたら実際に動かしてもう少し確かめてみようと思います。

stp.plには何も定義せずにいました。
しかし、今回ご指導頂いた方法$CNF::post{$item}{'indispensable'}を定義させる事で無事に問題を解決させる事が出来ました。

本当にご協力心から感謝しています。
有難う御座いました。