Internet Tips

お手軽(?)スパムブロック

(1) フリーCGIに投稿キー機能をつけてみる

 曲がりなりにもサイトなど持ち、かつ掲示板を設置しているとスパムに悩まされませんか?
 実は、このスパムに対してかなり有効なスパムブロックを施した掲示板スクリプトを公開してくれているサイトがあるのです。

掲示板改造支援サイト

 「掲示板改造支援サイト」・・・フリーCGIの有名どころ、Kent-webの配布しているCGIのスパム対策部分を強化したものを配布しているサイトです。ちなみに、私も当サイトの掲示板に使わせていただいております。効果の方は、いまのところ有効なようです。ただ、うちは過疎サイトもいいところなので、あまり参考にならないかもしれませんが(^^ゞ
 で、他の方にもお奨めするのですが、ハッキリ言ってCGIの設置になれていない方だと色々引っかかるところがあるようで・・・

 ここからが本題。
 なら、設置の簡単な方法はないものか?と考えて作ったのが、以下紹介する「小改造型ASKA BBS」であります。Kentさんの作った掲示板CGIのうち、「ASKA BBS」は最も設置が簡単なものです。何しろ、ファイル構成がシンプルこの上ないもので。

改造したポイントは以下の通り
・投稿キーを乱数にして発生させ、その投稿キーと同じ入力がない場合、投稿を無効にする。
・デザイン部分での小変更、タイトル下に管理者コメントを入れられるようにし、デザイン要素を代数化。文字色、サイズを他の設定項目と同じ箇所で、ユーザー指定できるようにしました。

 改造したスクリプトについては、こちらのサンプルをご覧下さい → sample
 そして、この改造スクリプトのダウンロードを希望される方は、以下の内容に同意した上でダウンロードして下さい。ダウンロードの場合は、「同意事項」下部のリンクテキストをクリックして下さい。

同意事項
  1. このCGIの元々の著作権は、Kent-webさんに帰属しますが、改造スクリプトに関する問い合わせ等を直接Kentさんに行うようなことは、絶対行わないで下さい。
  2. 問い合わせ等、ある程度のことは対応したいと思いますが、基本的にフリースクリプトなので動作等に関する保障は、行っておりません。あくまでも自己責任の範囲内で。
  3. 上記事項と関係いたしますが、サーバーの契約条件や仕様により、正常に作動しない場合があります。

以上の事項に同意し、プログラムをダウンロードします

 なお、同意事項と関係しますが、このCGIに関する話題などは、当サイトの正規掲示板にて行って下さい。サンプル掲示板に書き込まれても、レス等は行わない場合が多いですし、第一見逃す可能性大です(^^ゞ

 次に、すでに自分で掲示板を持っている方向けというか、自分で改造したい人向け。あくまでも、プログラム部分に自分で手を入れたい人向けのお話です。
 「ASKA BBS」での改造と使用しているサブルーチンを簡単に解説します。
 まず、このサブルーチンをテキストエリアからコピーして下さい。

 コピーしたら、オリジナルの「aska.cgi」ソース文末にコピーします。
 次に、オリジナルの「aska.cgi」の「記事表示」部分、サブルーチン「sub html」の部分、投稿欄のテーブル部分(メッセージ入力部分の行</tr>の後)に以下の行とルーチン呼び出しを追記します。

 代数「$keycode」を表示し、かつ投稿キーを入力する欄をここで作成するわけですね。テキストボックス内は、スタイルシートでIMEパッドを無効にしています。
 ここまでの追記が済んだら、次にサブルーチン「sub regist」、ログへの記事カキコミ部分ですね。この中の「local($err);」から始まるフォームチェックの項目の中に以下の記述を加えます。

if ($in{'keycode'} ne $in{'rightkey'}) { $err .= "投稿キーが不正です。<br>"; }

 実際に記述すると以下のようになります。

# フォーム内容をチェック
local($err);
if ($in{'name'} eq "") { $err .= "名前が入力されていません<br>"; }
if ($in{'comment'} eq "") { $err .= "コメントが入力されていません<br>"; }
if ($in{'keycode'} ne $in{'rightkey'}) { $err .= "投稿キーが不正です。<br>"; }
if ($in{'email'} && $in{'email'}!~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/) {
         $err .= "Eメールの入力内容が不正です<br>";
     }

 ここまでの改造をした上で、動くかどうかチェックしてみましょう。

 最後にユーザー設定の追加部分です。投稿キーのデザイン要素も代数化しているので、それに関する設定も必要になりますので。以下の内容をユーザー設定に加えましょう。
# タイトル直下説明文...""内に記入。途中改行を入れたい場合は、<br>を入れて下さい。
$ext_text = "投稿キー入力欄横の数値を入力しないと、無効な投稿として処理されます。<br>表\示される投稿キーは、固定されておらず、投稿画面を開く度、ランダムに変化します。";

# 説明文文字サイズ
$text_s = "16px";

# 説明文文字色
$text_c = "#5f9ea0";

# 投稿キーのフォント色
$keycolor = "#00008b";

 全て、""内に指定する項目を入れていくのですが、多少は分かりやすくなるかと思い、サンプルCGIに使用している設定項目をそのまま入れています。$ext_textの値は、一見複数行に渡っているように見えますが、実際には文末のセミコロンまでを含めて一行文字列のデータです。

 改造手法は以上!
次は、このCGIをベースにもうワンステップ改造を進めたものです。

(2) アクセス制御を取り入れる

 次に、(1)の投稿キー対応型の改造を施したCGIにアクセス制御を組み入れます。
 アクセス制御といっても、掲示板は原則として、不特定多数のユーザーとのコミュニケーションを目的としたスクリプトですから、別に要ID・パスワードでのアクセスをしようというわけではありません。単に、直接アクセスを制限しようというものです。
 方法としては、.httpaccessを用いた方法やクッキーを使用した方法がありますが、あいにく.htaccessは無料サーバーの殆どは使用禁止ですし、クッキーを使用した方法は現在の私では心もとない(^^ゞ

 ではどうするのか?
 「aska.cgi」の場合、ひとつのスクリプトで「記事表示・投稿・編集・削除」という動作を行います。フォームでそれらのデータを送る際には、実は「mode」という要素にそれぞれ値を与え、その値により処理内容を切り替えているのです。この切り替えのうち、「記事表示」については、実は「mode」が値を持たない状態でアクセスした時に表示される仕組みになっているのです。そこで、この「記事表示」も「mode」が「load」という値を持っている時にのみ表示するようにしました。指定された以外の値、または空データの場合にはエラーが返ります。サブルーチンを(1)の状態からさらにひとつ増やします。

 さて、問題はこれからなのですが、申し訳ないですが割愛^_^;
 正直、分かる方は、こちらからソースをダウンロードして下さい、としか・・・・。実は色々いじくるところがあるのですよ。

当サイト内の規定に従い、ファイルをダウンロード

 ちなみに、サンプルはこちらからご覧になれます。→sample

 アクセスできたら、サンプルCGIのURLをコピーして、ブラウザのアドレスバーにペースト。直接アクセスしてみて下さい。エラーページが表示される筈です。
 このCGIへ正常にアクセスするためには、リンクするページ部分に以下のようなソースが必要になります。

 さて、このリンク方法、ちと面倒でしょうか?
 ひとつネタバレすると、このCGIへのリンク、実は裏技として、いちいちフォームデータを送らずとも通常のリンクでつなげる方法があるにはあるのです。リンクを貼る時のCGIパスに「?mode=load」という文字列を加えること。例えば、CGIのURLが、「http://xxx.jp/aska.cgi」だとします。この場合のリンクは、

<a href="http://xxx.jp/aska.cgi?mode=load">任意の文字列または画像</a>

となります。ただ、本当にこれをすると、訪問者に手の内がバレバレですけどね(^^ゞ
 アクセス制限の目的は、スパム側に対して、プログラムへの直接アクセスを制限することと同時に一般ユーザーに対してもアクセス制限をかけることになります。つまり、「お気に入り」などに登録しての直接の閲覧も禁止するわけですね。
 そうした、痛し痒しの部分もある上、このスクリプト自体がまだ検証の余地がありますので、使用の場合はあくまでも自己責任の範囲内で!


以上、つらつらと述べてまいりましたが、多少なりともご参考に慣れたとしたら嬉しい(~o~)
※サンプルBBSにカキコされても、レスは原則いたしませんのでご了承おきをm(__)m
※本当にちゃんとスパム対策されたい方は、先にご紹介したスパムブロック強化型CGIの採用を考えておいた方がいいですよ。ここで紹介した方法は、あくまでも「簡易的なもの」ですので。

2007/07/18

-back-