Top > Movable Type > カスタマイズ > コメントスパム [全て開く]
2006年5月31日

mt-config.cgi のアクセス制限について

May 31,2006 2:15 AM
Tag:[, ]
Permalink

巷では Movable Type 3.3 の話題で賑わっているようですが、当サイトのコメントスパムで重大な問題が発生していることが発覚しました。情報展開ということでお知らせします。

まず、下記のエントリーのコメントをご覧ください。

blog設定

このエントリーがブログを始めた記念すべき最初のエントリーということはおいといて、本エントリーに表示されているコメントスパムを1週間ほど前から数件/日のペースで受信していたため、セキュリティコード入力によりフィルタリングを実施しました。

ところがコメントスパムは止みませんでした。「このスパマーは手動で投稿しているのか?」と思い、次にこのコメンターの名前「100?」でフィルタリングをする設定を施しました。

しかし変化はなく、スパムコメントは投稿されてしまっていました。最後の手段として、このエントリーのコメントをクローズしたのですが、それでもスパムコメントは投稿され続けています。それが先程ご覧になったコメントです。

原因は mt4i からのコメントスパムでした。下記の内容は誤りです。

これらの対処が有効にならず、さすがに空恐ろしくなりました。
おそらく(というか間違いなく)、mt-config.cgi あるいは cookie 情報を盗まれています。そしてすべての防御をかいくぐってスパムコメントを投稿できる理由は、スパマーが自身の所有する Movable Type のようなシステムから(私のDB情報を設定して)遠隔でDBにアクセスして投稿しているのではないかと推測されます。
そう考えると、URLが大量に記述されているにもかかわらず SpamLookup - Link にひっかからない理由も納得できます。

ということで、こまめなログアウトの実施と、mt.cgi のディレクトリに下記の .htaccess を配置することを推奨します。

<Files mt-config.cgi>
  deny from all
</Files>
Comments [9] | Trackbacks [2]
2006年4月28日

SCode プラグインでコメントスパムを制限する(その2:Typekeyサイン・インとの競合制御)

April 28,2006 12:30 AM
Tag:[, , , , ]
Permalink
サイン・イン状態でセキュリティコードが表示されてしまう状態その1:基本設定ではプラグインの導入によってコメントフォームにセキュリティコードが表示されるようになりましたが、Typekey 認証を利用している場合、左のスクリーンショットのようにサイン・イン後もセキュリティコードの入力が要求されます。これは過度なセキュリティであり、ユーザビリティ上も好ましくありません。
カスタマイズによりサイン・イン状態でセキュリティコードを非表示にするということで、ご質問を頂きましたので、本エントリーでは Typekey サイン・イン状態の場合、セキュリティコードの入力欄を非表示にし(左図)、チェック機能を無効にするカスタマイズを紹介します。
3.1x 時代に MT-SCode を紹介した時に同じカスタマイズを行っていたのですが、質問を頂いて思い出しました。全く忘却の彼方でした。すいません。

以下、カスタマイズ方法です。注:カスタマイズは、その1:基本設定で SCode プラグインの設定が完了していることが前提となります。

1.テンプレートの修正

管理メニューより個別エントリーアーカイブテンプレートを開き、前回の4項で追加したセキュリティコード表示部分に対して、青色で示す id 属性および JavaScript を追加します。この追加によりサイン・イン状態を判定して、サイン・イン状態であればセキュリティコード入力エリアを表示しないようになります。

<p id="securitycode">
   <label for="scode">Security Code:</label>
   <input type="hidden" id="code" name="code" value="<$MTSecurityCode$>" />
   <img class="scode" src="<$MTCGIPath$><$MTSecurityImage$>?code=<$MTSecurityCode$>" /><input id="scode" name="scode" />
</p>
 
<MTIfNonEmpty tag="MTTypeKeyToken">
<script type="text/javascript">
<!--
if (commenter_name) {
   document.getElementById('securitycode').style.display = 'none';
}
// -->
</script>
</MTIfNonEmpty>

コメント・プレビュー画面やコメント・エラー画面にコメントフォームを表示し、SCode を適用している場合、同様の修正を行ってください。

2.プラグイン の修正

1項の作業は画面上セキュリティコードを非表示にするだけなので、これでコメントを投稿するとセキュリティコードが入力されていない状態と同じです。
ということで、cookie に保持されているサイン・イン状態を取得・判定して、サイン・インされていればセキュリティコードチェックを実施しない処理を追加します。

アップロードした SCode プラグインのディレクトリにある plugins/SCode/SCode.pl をダウンロードし、下記のパッチ

--- SCode.pl.bak        Wed May 31 01:40:56 2006
+++ SCode.pl    Wed May 31 01:42:15 2006
@@ -174,11 +174,20 @@
     my $scode = $q->param('scode');
     my $sscode = SCode::scode_get($code);
 
-    if ($scode ne $sscode) {
+    my $class = $ENV{MOD_PERL} ? 'Apache::Cookie' : 'CGI::Cookie';
+    eval "use $class;";
+    my $cookies = $class->fetch;
+    my $commenter_name = "";
+    if ($cookies && $cookies->{commenter_name} && $cookies->{commenter_name}->value()) {
+        $commenter_name = MT::I18N::encode_text($cookies->{commenter_name}->value(),'utf-8',undef);
+    }
+    if (!$commenter_name) {
+        if ($scode ne $sscode) {
                 my $score = -3;
                 my $msg = "Comment junked due to incorrect code entered";
                  return ($score, [$msg]);
-    }
+        }
+    }
         SCode::scode_delete($code);
         SCode::scode_create($code);
     }
@@ -196,8 +205,18 @@
     my $code = $q->param('code');
     my $scode = $q->param('scode');
     my $sscode = SCode::scode_get($code);
-    if ($scode ne $sscode) {
-        return 0;
+
+    my $class = $ENV{MOD_PERL} ? 'Apache::Cookie' : 'CGI::Cookie';
+    eval "use $class;";
+    my $cookies = $class->fetch;
+    my $commenter_name = "";
+    if ($cookies && $cookies->{commenter_name} && $cookies->{commenter_name}->value()) {
+        $commenter_name = MT::I18N::encode_text($cookies->{commenter_name}->value(),'utf-8',undef);
+    }
+    if (!$commenter_name) {
+        if ($scode ne $sscode) {
+            return 0;
+        }
     }
     SCode::scode_delete($code);
     SCode::scode_create($code);

をあてます。
パッチのあて方が分からない場合は、ダウンロードした SCode.pl を任意のエディタで開き、下記の青色部分を追加してください。

if($config->{action} == 1 && $blog_config && $blog_config->{scode_enable} == 1) {
my $code = $q->param('code');
my $scode = $q->param('scode');
my $sscode = SCode::scode_get($code);
 
my $class = $ENV{MOD_PERL} ? 'Apache::Cookie' : 'CGI::Cookie';
eval "use $class;";
my $cookies = $class->fetch;
my $commenter_name = "";
if ($cookies && $cookies->{commenter_name} && $cookies->{commenter_name}->value()) {
    $commenter_name = MT::I18N::encode_text($cookies->{commenter_name}->value(),'utf-8',undef);
}
if (!$commenter_name) {
    if ($scode ne $sscode) {
            my $score = -3;
            my $msg = "Comment junked due to incorrect code entered";
             return ($score, [$msg]);
    }    
}
    SCode::scode_delete($code);
    SCode::scode_create($code);
      :
    (中略)
      :
my $code = $q->param('code');
my $scode = $q->param('scode');
my $sscode = SCode::scode_get($code);
 
my $class = $ENV{MOD_PERL} ? 'Apache::Cookie' : 'CGI::Cookie';
eval "use $class;";
my $cookies = $class->fetch;
my $commenter_name = "";
if ($cookies && $cookies->{commenter_name} && $cookies->{commenter_name}->value()) {
    $commenter_name = MT::I18N::encode_text($cookies->{commenter_name}->value(),'utf-8',undef);
}
if (!$commenter_name) {
    if ($scode ne $sscode) {
        return 0;
    }
}
SCode::scode_delete($code);
SCode::scode_create($code); 

SCode.pl を修正したら元のディレクトリにアップロードしてください。

以上です。
これでサイン・インを行うとセキュリティコードが非表示・無効になります。

2006.05.31 追記
Junk Comment に設定した場合に有効にならない不具合がありましたのでパッチおよび改変内容を修正しました。

Comments [23] | Trackbacks [7]
2006年4月17日

SCode プラグインでコメントスパムを制限する(その1:基本設定)

SCode プラグインこのプラグインはいわゆる「コメントスパム防止プラグイン」で、スクリーンショットのようにコメントフォームにランダムな数字(セキュリティコード)を画像で表示し、その数字をテキストエリアに設定・認証することで、手動で送信されたコメントとスパムロボットが送信したコメントを区別します(CAPTCHAという技術)。

以前、MT-SCode プラグインによるコメントスパム対策(その1)という記事をエントリーしたのですが、3.1x用のカスタマイズだったため、3.2用のカスタマイズについてご紹介します。プラグインも SCode という名称になり、旧エントリーで紹介したものからバージョンアップされています。

このプラグインを利用するには GD Graphics Library または GD Perl Module がインストールされている必要があります。さくらレンタルサーバの場合はインストールされているようですが、サポート状況についてはご自身でご確認ください。
またこのエントリーはプラグインの紹介であり、動作を保証するものではありませんので、設定についてはご自身の責任で行ってください。

コメントスパム対策は Ogawa::memoranda さんの「Captcha Plugin」もあります。
またトラックバックスパムに困っている方は「asciiTBPingfilter プラグイン」をご利用ください。

1.プラグインのダウンロード

下記のサイトより SCode プラグインをダウンロードします。

Movalog PluginsSCode

ダウンロードのリンクは Installation にある「plugin」です。

2.プラグインのアップロード

ダウンロードしたアーカイブを解凍すると php および plugins ディレクトリがありますので、そのままMTの php ディレクトリおよび plugins ディレクトリへ、下記の構成になるようにアップロードします。

  • php/plugins/~
  • plugins/SCode/~

アップロード後、plugins/SCode/mt-scode.cgi のパーミッションを 755 等に変更してください。

すべてアップロードした後、Movable Type 管理画面のメイン・メニューの右側にあるシステムメニューの「プラグイン」をクリックして「SCode」が表示されればインストールOKです。

3.プラグインの設定

プラグインを有効にするために2ヶ所設定する必要があります。

SCode プラグインまず、メイン・メニューの右側にあるシステムメニューの「プラグイン」をクリックして「SCode」の右側にある「設定を表示」をクリックします。
スクリーンショットのような画面が表示されますので、必要な部分を設定します。

Temp Directory:
セキュリティコードを保存するためのディレクトリ。Movable Type から書き込みできるパーミッションが必要です。このディレクトリは ドキュメントルート(public_html) より上位に設定します。そうでなければスパムロボットはディレクトリの中を参照し、入力すべきセキュリティコードを解読するおそれがあります。注:最後に必ず "/" を付与してください。
Length:
セキュリティコード長(デフォルトは6桁)
Max Temp Files:
Temp Directory に保存する最大ファイル数(デフォルトは50)。このファイル数がセキュリティコードのバリエーションに等しくなると思われます。つまり50ファイルであれば、各エントリーに50パターンのセキュリティコードが割り当てられます。なお1エントリーに割り当てられるセキュリティコードは一つで、再構築を契機に再割り当てされます(動的にコードが割り当てられるものではありません)。
Action:
セキュリティコード認証エラー時のアクション(コメント拒否または迷惑コメントとして受け付ける)

設定したら「変更を保存」をクリックします。

SCode プラグイン次に、ブログ別の管理メニューに進み、「設定」→「プラグイン」をクリックして「SCode」の右側にある「設定を表示」をクリックして、「Enable Security Code (CAPTCHA) checking on this blog.」の欄のチェックボックスをチェックして「変更を保存」をクリックしてください。

4.テンプレートの修正

エントリー・アーカイブおよびコメント・プレビュー等のコメント入力フォームにセキュリティコード用のタグ(青色)を追加します(公開テンプレートの設定例です)。

   :
<p>
   <label for="comment-bake-cookie"><input type="checkbox"
      id="comment-bake-cookie" name="bakecookie" tabindex="9" accesskey="r" onclick="if (!this.checked) forgetMe(document.comments_form)" value="1" onkeypress="if (!this.checked) forgetMe(document.comments_form)" />
      情報を保存する?</label>
</p>
<p>
   <label for="scode">Security Code:</label>
   <input type="hidden" id="code" name="code" value="<$MTSecurityCode$>" />
   <img class="scode" src="<$MTCGIPath$><$MTSecurityImage$>?code=<$MTSecurityCode$>" /><input id="scode" name="scode" />
</p>
</div>
<p id="comments-open-text">
   <label for="comment-text">コメント:<MTIfAllowCommentHTML>(スタイル用のHTMLタグが使えます)</MTIfAllowCommentHTML></label>
   <textarea id="comment-text" name="text" tabindex="10" accesskey="t" rows="10" cols="30"></textarea>
</p>
   :

なお上記のタグの代わりに

<MTSCodeInsert>

を記述するだけで同様のタグに置き換えてくれます。ただし、改行タグ等が含まれるのでレイアウトをきちんとしたい場合は上の設定を推奨します。

SCode プラグインここまでの設定を終えた後、保存・再構築すれば SCode が動作するようになります。
左のスクリーンショットのように、コメントフォームにセキュリティコードが表示されることと、適当なセキュリティコードを入力してコメントが反映されないことを確認してください。

SCode プラグイン3項で「コメントを拒否する」設定にしている場合は、セキュリティコードNGのコメントを投稿した場合、スクリーンショットのように「不必要なコメントの投稿を防ぐために、連続した投稿を受け付けないように設定しています。しばらくしてから、もう一度試してみてください」というエラーを表示する仕組みになっているようです。

5.CSS設定

4項の状態では画像とセキュリティコード入力エリアのレイアウトが揃っていないため、スタイルシートに下記のようなセレクタを追加します(公開テンプレートの設定例です)。

.scode {
    vertical-align: top;
}
 
#scode {
    margin-left: 5px;
}

SCode プラグインこの設定を行うことで、左のようにレイアウトが整います。

6.セキュリティコードのサイズ変更

5項までの設定で完成ですが、セキュリティコードの画像の高さを狭くしてテキスト入力エリアと高さを揃えたい場合、plugins ディレクトリにある SCode.pm のコードを下記のように変更すれば画像サイズを修正することができます。赤色の値を青色にそれぞれ変更してください。
なおこの項目を無理に実施する必要はありません。

my $im = new GD::Image($im_length,2518);
 
# define the color we going to use
my $c_background = $im->colorAllocate(224,224,224);
my $c_border = $im->colorAllocate(0,0,0);
my $c_line = $im->colorAllocate(192,192,192);
my $c_code = $im->colorAllocate(128,128,128);
 
# Fill in the background
$im->fill(50,50,$c_background);
 
# Draw the borders lines
for (my $i=0;$i<$im_length;$i+=5) {
  $im->line($i,0,$i,2417,$c_line);
}
 
for (my $i=0;$i<25;$i+=5) {
  $im->line(0,$i,$im_length-1,$i,$c_line);
}
 
$im->rectangle(0,0,$im_length-1,2417,$c_border);
 
# Write the code
$im->string(gdGiantFont,8,51,$scode,$c_code);

SCode プラグインこの変更を行うことで、冒頭のスクリーンショットのように画像とテキスト入力エリアの高さが揃います。

2006.05.13 追記
3項の Temp Directory について、末尾に "/" 付与を追記しました。

Comments [90] | Trackbacks [50]
2005年5月24日

MT-SCode プラグインによるコメントスパム対策(その2:Typekeyサイン・インとの競合制御)

前回の記事では原文にもとづいたカスタマイズ(+公開テンプレートに合わせた修正)を行いましたが、そのままの状態では Typekey 認証を設定している場合、サイン・イン後もセキュリティコードの設定が要求されます。サイン・インを行った後は他の認証手段と併用しない方がコメンターにとってはありがたいと思われますので、今回はその部分の修正について紹介したいと思います。
カスタマイズの前に、前回の記事で MT-SCode プラグインの設定が全て完了していることが前提となります。

1.テンプレートの修正

管理メニューより個別エントリーアーカイブテンプレートを開き、前回の6項(または9項)で追加したセキュリティコード表示部分に対して、div タグおよび JavaScript を追加します。この追加によりサイン・イン状態を判定して、サイン・イン状態であればセキュリティコード入力エリアを表示しないようになります。
リストのように、セキュリティコード表示用タグに対して青色部分を追加してください。9項に追加するイメージで書いてますが、挿入箇所は6項も同様です。

<!-- Security Code Check -->
<div id="securitycode">
<p><label for="securityCode"> Security Code:</label><br />
<input type="hidden" id="code" name="code" value="<$MTSecurityCode$>" />
<input tabindex=3 id="scode" name="scode" />
<img border="0" src="<$MTCGIPath$><$MTSecurityImage$>?code=<$MTSecurityCode$>" style="vertical-align: middle; margin-top:-6px;" /><br />
手動で送信されたコメントであることを示すために、上のボックスに表示されている通りに数字を入力してください</p>
</div>
<!-- end of Security Code Check -->
 
<MTIfNonEmpty tag="MTTypeKeyToken">
<script language="javascript" type="text/javascript">
<!--
if (commenter_name) {
    document.getElementById('securitycode').style.display = 'none';
}
// -->
</script>
</MTIfNonEmpty>

なお前回の6項では、セキュリティコード表示の設定箇所が「TypeKey サイン・インを常に要求する場合」と「TypeKey サイン・インをしなくてもコメント可能な場合」の計2ヶ所あり、今回の修正は下方、つまり「TypeKey サイン・インをしなくてもコメント可能な場合」のコメント用フォームに対して実施します。文章ではわかりづらいので下に個別エントリーアーカイブテンプレートのタグの抜粋を示します。

<MTIfRegistrationRequired>
    <MTIfNonEmpty tag="MTTypeKeyToken">
            :
        TypeKey サイン・インを常に要求し、
        TypeKeyが設定されている場合の処理
        コメント用フォーム表示<MTElse>
            :
        TypeKey サイン・インを常に要求し、
        TypeKeyが設定されていない場合の処理(=環境設定誤り)
            :
    </MTElse>
    </MTIfNonEmpty>
<MTElse>
            :
    TypeKey サイン・インをしなくてもコメント可能な場合の処理
    コメント用フォーム表示</MTElse>
</MTIfRegistrationRequired>

ご覧の通り、赤色部分にコメントフォームが計2ヶ所あります。下にある方が今回の修正対象です。
どちらのコメント用フォームが使われるかは、管理メニューの「ウェブログの設定」→「設定」の「コメントの設定」欄にある「未登録の読者からのコメントを受けつける」のチェックボックスへのチェック有無で決まります。チェックされていなければ上のフォーム、チェックされていれば下のフォームが適用されます。
また、上のフォームは「未登録の読者からのコメントを受けつける」にチェックがついていない場合にしか使われないため、前回の説明で既にセキュリティコード表示が設定されている場合は Typekey 認証と競合するため削除してください(厳密に言うと、「未登録の読者からのコメントを受けつける」にチェックをされているのであれば、放っておいても構いません)。

2.Comments.pm の修正

ここでの修正は、cookie に保持されているサイン・イン状態を取得・判定して、サイン・インされていればセキュリティコードチェックを実施しない処理の追加です(1項で非表示にしてもセキュリティチェック自体は実施されるため)。
lib/MT/App/Comments.pm をダウンロードし、任意のエディタで開いて、前回の5項の設定に対して下記の青色部分を追加してください(8行ほど挿入した数行下に "}" の挿入がありますのでご注意ください)。

# SecurityCode hack start 
#
require MT::SCode;
my $code = $q->param('code');
my $scode = $q->param('scode');
my $sscode = MT::SCode::scode_get($code);
 
my $class = $ENV{MOD_PERL} ? 'Apache::Cookie' : 'CGI::Cookie';
eval "use $class;";
my $cookies = $class->fetch;
my $commenter_name = "";
if ($cookies && $cookies->{commenter_name} && $cookies->{commenter_name}->value()) {
    $commenter_name = MT::I18N::encode_text($cookies->{commenter_name}->value(),'utf-8',undef);
}
if (!$commenter_name) {
 
if ($scode ne $sscode) {
    return $app->handle_error($app->translate(
       "Wrong or missing Security Code."));
}
 
}
 
MT::SCode::scode_delete($code);
MT::SCode::scode_create($code);
#
# Security hack ends

3.Context.pm の修正

この項では、コメント・プレビュー/コメント・エラーページに対して、Typekey サイン・イン状態を判定して、サイン・イン状態であればセキュリティコード入力エリアを表示しないための修正です。
lib/MT/Template/Context.pm をダウンロードし、任意のエディタで開いて、前回の8項または10項で行った設定に対して青色部分を追加してください。

<!-- Security Code Check -->
<div id="securitycode">
<p><label for="securityCode">Security Code:</label><br />
<input type="hidden" id="code" name="code" value="$securitycode" />
<input tabindex=3 id="scode" name="scode" />
<img border="0" alt="Please enter the security code you see here" src="$path/mt-scode.cgi?code=$securitycode" style="vertical-align: middle; margin-top:-6px;" /><br />
<MT_TRANS phrase="Please enter the security code you see here."></p>
</div>
<!-- end of Security Code Check -->
HTML
        if ($rem_auth_token && $registration_allowed) {
        $result .= MT->translate_templatized(<<HTML);
<script language="javascript" type="text/javascript">
<!--
if (getCookie("commenter_name")) {
    document.getElementById('securitycode').style.display = 'none';
}
// -->
</script>
HTML
        }
        $result .= MT->translate_templatized(<<HTML);
Comments [2] | Trackbacks [3]
2005年5月13日

MT-SCode プラグインによるコメントスパム対策(その1)

本エントリーは 3.1x までの内容です。3.2x についてはSCode プラグインでコメントスパムを制限するを参照ください。

MT-SCode プラグインMT-SCode プラグインを利用したコメントスパム対策を紹介します。

このプラグインはサンプル画像で示している通り、ランダムな数字を画像で表示し、それをセキュリティコード用のテキストエリアに設定・認証することで手動で送信されたコメントとスパムロボットが送信したコメントを区別します。実際にはもう少し歪んだ画像にすると完全なものになると思いますが、ある程度の効果は期待できそうです。google のサイト登録画面等で用いられている技術です。

以下、READMEに書かれていた英文の翻訳(適当)を交えてカスタマイズ手順を紹介します。文章内のカッコの数字はREADMEで記されている番号を表わしています。最初にマニュアル通りの説明を行い、その後サンプル画像の表示になるよう、少し手を加えたカスタマイズについて説明します。最初からサンプル画像のようにする場合、6項と8項はスキップしてください。
また Typekey 認証と競合させたくない場合、つまりサイン・イン後のセキュリティコードチェックを行いたくない場合は、本エントリーのカスタマイズを行った後、MT-SCode プラグインによるコメントスパム対策(その2:Typekeyサイン・インとの競合制御)を参照してください。

なお参考サイトは下記です。ありがとうございました。

krbys.netMT-SCodeプラグインでスパム対策
James Seng's BlogSolution for comments spams(プラグイン配布元)

1.GDライブラリのインストール

レンタルサーバの方は本項目をスキップしてください。ただし Perl ライブラリの GD モジュールがインストールされていることが条件です。GDライブラリがインストールされていない場合は画像が表示されません。(1)
自宅サーバ(Windows)におけるGDライブラリのインストールは、MS-DOS画面(コマンドプロンプト)より、下記のコマンド(青色)を実行してください。

C:\>ppm
PPM interactive shell (2.2.0) - type 'help' for available commands.
PPM> install GD
Install package 'GD?' (y/N): y
Installing package 'GD'...
Downloading http://ppm.ActiveState.com/PPMPackages/5.6plus/MSWin32-x86-multi-thread/GD.tar.gz ...
Installing C:\usr\site\lib\auto\GD\GD.bs
Installing C:\usr\site\lib\auto\GD\GD.dll
Installing C:\usr\site\lib\auto\GD\GD.exp
Installing C:\usr\site\lib\auto\GD\GD.lib
Installing C:\usr\html\site\lib\GD.html
Installing C:\usr\site\lib\GD.pm
Installing C:\usr\site\lib\qd.pl
Installing C:\usr\site\lib\auto\GD\autosplit.ix
PPM> quit
Quit!

2.プラグインのダウンロード

下記のサイトより MT-SCode プラグインをダウンロードします。

James Seng's BlogSolution for comments spams

アーカイブへのダウンロードは本文内に「Download latest mt-scode」というリンクがあります.他にも何ヶ所かあるようです。
ダウンロードしたアーカイブを解凍すると下記のファイルがあります。

mt-scode.cgi
README
scode.pl
SCode.pm
scodetest.cgi

太字は今回利用するファイルです。アップロードは後で行います。

3.SCode.pm の編集

ここでは tmp ディレクトリの設定と、SCode.pm にセキュリティコード桁長の設定を行います(2)。
まずディレクトリ tmp を作成します。その後 SCode.pm を任意のエディタで開き、さきほど作成したディレクトリを設定します(青色部分)。

# tmp directory
# Notice the '/' at the end . You need to have that '/'
# ie, my $tmpdir = "/tmp/captcha' wont work. You need '/tmp/captcha/'
my $tmpdir = "/tmp/"; 

tmp ディレクトリにはセキュリティコードが保存されます。このディレクトリは ドキュメントルート(public_html) より上位に設定します。そうでなければスパムロボットは自動的にどのようなコードを入力すればよいか、フォルダの中を見られるおそれがあります。
tmp ディレクトリのパーミッションは 755 に設定します。うまくいかない場合は 775 または 777 にしますが、これらはセキュリティ上推奨できるパーミッションではありません。

セキュリティコード桁長を変更する場合は下記の青色部分を変更します。デフォルト値は6桁です。

# the length of the security code
my $scode_length = 6;

4.ファイルのアップロード

それぞれ次のディレクトリにアップロードします。(3)?(5)

SCode.pm - lib/MT/ ディレクトリ
mt-scode.cgi - mt.cgi と同じディレクトリ。パーミッションは 755
scode.pl - plugins ディレクトリ

5.Comments.pm の編集

(6)

現在の lib/MT/App/Comments.pm をダウンロードし、任意のエディタで開いて次の3行を検索します。

if (!$q->param('text')) {
        return $app->handle_error($app->translate("Comment text is required."));
}

見つかったら、そのすぐ下に下記を追加してください。

# SecurityCode hack start 
#
require MT::SCode;
my $code = $q->param('code');
my $scode = $q->param('scode');
my $sscode = MT::SCode::scode_get($code);
if ($scode ne $sscode) {
    return $app->handle_error($app->translate(
       "Wrong or missing Security Code."));
}
MT::SCode::scode_delete($code);
MT::SCode::scode_create($code);
#
# Security hack ends

参考:READMEに書かれている、上記コードを挿入した次のコードは 3.x では異なっているようですので無視。

6.テンプレートの編集

(7)

管理画面の「テンプレート」をクリックして、個別エントリーアーカイブテンプレートを編集します。
参考:READMEではコメント・リスト/コメント・プレビュー/コメント・エラーも編集対象になっていますが、3.x で実際に編集するのは個別エントリーアーカイブのみです。

<input type="submit" …(後略)…

を検索して、その上に下記のHTMLタグを追加します。

<!-- Security Code Check -->
<input type="hidden" id="code" name="code" value="<$MTSecurityCode$>" />
<img border="0" src="<$MTCGIPath$><$MTSecurityImage$>?code=<$MTSecurityCode$>"><br />
<input tabindex=3 id="scode" name="scode" /><br /><br />
<!-- end of Security Code Check -->

先の文字列検索では2ヶ所ヒットしますが、3.x の個別エントリーアーカイブのフォーム入力欄は、Typekey サイン・インなしでコメントを許容する場合と常にサイン・インを要求する場合のフォームが別々に用意されているためです。常にサイン・インを要求する設定にセキュリティコードを適用させない場合は、文字列検索で後に見つかった方のみに設定してください。
また、3.x の個別エントリーアーカイブのフォーム入力欄は Typekey サイン・イン時とそれ以外の場合の2ヶ所があります。Typekey サイン・イン時にセキュリティコードの入力を不要とするのであれば

<input type="submit"

の検索で後方で見つかったフォームのみに設定してください。

7.MTBlacklist プラグインとの競合について

(8)

Jay Allen's MTBlacklist プラグインを利用している場合、それを無効にしてください。そうでない場合は Comment.pm への追加と同じ作業を plugins/jayallen/MTBlPost.pm に行ってください。

8.Context.pm の編集

(10)?(17)

この項の追加でコメント・プレビュー/コメント・エラーページにセキュリティコードを表示できるようになります。現在の lib/MT/Template/Context.pm をダウンロードし、任意のエディタで次の部分を検索してください。

sub _hdlr_comment_fields {
    my ($ctx, $args, $cond) = @_;

見つかったら、そのすぐ下に下記を追加します。

# Security code validation
require MT::SCode;   # <-- new addition
srand int (time/10)+$$;
my $securitycode = int rand(MT::SCode::scode_tmp());
$securitycode++;
MT::SCode::scode_create($securitycode);
# End Security code hack

同じファイルで次のタグを探してください。(16)

<MT_TRANS phrase="Remember me?">
<input type="radio" id="remember" name="bakecookie" …

見つかったら、そのすぐ下に下記を追加します。(17)

<!-- Security Code Check -->
<input type="hidden" id="code" name="code" value="$securitycode" />
<label for="scode">Security Code:</label><br />
<img border="0" alt="Please enter the security code you see here" src="$path/mt-scode.cgi?code=$securitycode" /><br />
<input tabindex="3" id="scode" name="scode" /><br /><br />
<!-- end of Security Code Check -->

16?17をもう一度繰り返します。
6項の個別エントリーアーカイブと同様、コメント・プレビュー/コメント・エラーページにも Typekey サイン・インなしでコメントを許容する場合と常にサイン・インを要求する場合の2ヶ所があります(2回繰り返しているのはそのためです)。常にサイン・インを要求する設定にセキュリティコードを適用させない場合は、文字列検索で後に見つかった方のみに設定してください。
つまり編集対象が2ヶ所あるのですが、個別エントリーアーカイブテンプレートと同様、Typekey でサイン・インした場合はセキュリティコードの設定を不要とする場合は、先と同様、後方で見つかった場合のみに設定してください。

生成される画像の色は、mt-scode.cgi の

# define the color we going to use
$c_background = $im->colorAllocate(224,224,224); # 背景
$c_border = $im->colorAllocate(0,0,0); # 枠線
$c_line = $im->colorAllocate(192,192,192); # 格子
$c_code = $im->colorAllocate(128,128,128); # 文字

でそれぞれ変更することができます。変更する場合はカッコ内の赤色部分をRGBにしたがって変更します。それぞれの意味は右側にあるコメントの通りです。
また、生成される画像数はデフォルトで50ですが、変更する場合は
SCode.pm の

# max number of temp files
my $scode_maxtmp = 50;

を編集してください。

以上です。次にサンプル画像のようにするためのカスタマイズです。公開テンプレートを元にしていますので、デフォルトテンプレート等では若干の修正が必要になりますが大体同じ仕上がりになると思います。

9.テンプレートの編集

個別エントリーアーカイブテンプレートのセキュリティコードの表示位置をテキストエリアの右側に表示します。6項で行った個別エントリーアーカイブテンプレートの編集の代わりに、下記のものを挿入してください(6項とは挿入位置が異なっておりますのでご注意ください)。

<!-- Security Code Check -->
<p><label for="securityCode"> Security Code:</label><br />
<input type="hidden" id="code" name="code" value="<$MTSecurityCode$>" />
<input tabindex=3 id="scode" name="scode" />
<img border="0" src="<$MTCGIPath$><$MTSecurityImage$>?code=<$MTSecurityCode$>" style="vertical-align: middle; margin-top:-6px;" /><br />
手動で送信されたコメントであることを示すために、上のボックスに表示されている通りに数字を入力してください</p>
<!-- end of Security Code Check -->
 
<p><label for="text">コメント:</label> <MTIfAllowCommentHTML>

10.Context.pm の編集

コメント・プレビュー/コメント・エラーのセキュリティコードの表示位置をテキストエリアの右側に表示します。8項で説明した lib/MT/Template/Context.pm の編集の代わりに、下記のものを挿入します(こちらは8項と同じ挿入位置です)。

<!-- Security Code Check -->
<p><label for="securityCode">Security Code:</label><br />
<input type="hidden" id="code" name="code" value="$securitycode" />
<input tabindex=3 id="scode" name="scode" />
<img border="0" alt="Please enter the security code you see here" src="$path/mt-scode.cgi?code=$securitycode" style="vertical-align: middle; margin-top:-6px;" /><br />
<MT_TRANS phrase="Please enter the security code you see here."></p>
<!-- end of Security Code Check -->

11.画像サイズ変更

サンプル画像のようにするために mt-scode.cgi のソースを変更してセキュリティコード用画像のサイズを修正ます。赤色部分を青色部分にそれぞれ変更してください。

# lets define the image
$im_length = (MT::SCode::scode_len()+1)*10;
$im = new GD::Image($im_length,2520);
     :
# Draw the borders lines
for ($i=0;$i<$im_length;$i+=5) {
  $im->line($i,0,$i,2419,$c_line);
}
     :
$im->rectangle(0,0,$im_length-1,2419,$c_border);
 
# Write the code
$im->string(gdGiantFont,8,52,$scode,$c_code);

12.日本語メッセージの追加

コメント・プレビュー/コメント・エラー画面のセキュリティコード欄への日本語表示と、セキュリティコードが誤っている場合の日本語メッセージをコメント・エラー画面に表示するため、lib/MT/L10N/ja.pm に下記の日本語コメント(青色)を追加します。

'Comment text is required.' => 'コメントの本文を入力してください。',
'Wrong or missing Security Code.' => 'セキュリティコードが誤っています。',
     :
'Comments:' => 'コメント:',
'Please enter the security code you see here.' => '手動で送信されたコメントであることを示すために、上のボックスに表示されている通りに数字を入力してください',

英語部分は適当なので適宜修正してください。修正する場合は、10項で編集したContext.pm の

<MT_TRANS phrase="Please enter the security code you see here."></p>

もあわせて修正してください(この部分をキーに ja.pm から日本語を索引しています)。

以上です。なお紹介しておいてこういうのもなんですが、セキュリティコードの値はスタティックページ生成時にMT変数タグとして設定されるので、個別エントリーアーカイブではエントリー単位で常に同じ値になります。コメント・プレビュー/コメント・エラーでは値が変化します。

Comments [45] | Trackbacks [13]
2005年4月28日

Quasi-Spam Filter Plugin バージョンアップ

April 28,2005 10:20 PM
Tag:[, , , ]
Permalink

Ogawa::Memoranda さんご提供のスパム対策プラグインが 2005.04.08 付で 0.20 にバージョンアップされておりまして、大変遅くなりましたが本日アップグレードさせて頂きました。バージョンアップに伴いフィルタ対象変更のカスタマイズが楽になりました。またカスタマイズ方法についても配布元で掲載くださっています。ありがとうございました。

ということで、当サイトではスクリプトを下記のようにカスタマイズ致しました。

プラグイン:Quasi-Spam Filter Plugin - Release 0.20
改変内容:下記参照

この変更で前回(コメントスパム対策(その6)トラックバックスパム対策(その2))までと同様の機能を継承しています。
プラグインは上記リンクよりダウンロードしてください。

改めて説明致しますと、このプラグインは、予め設定した文字列を含むコメント・トラックバックをフィルタリング(エラー返送等)してくれるという仕組みになっています。例えば "hoge" をフィルタ文字としてプラグインに設定しておけば、"hoge" が含まれるコメント・トラックバックは受け付けません。またフィルタ文字とは別に、フィルタリングしたい対象エリアを、コメント・トラックバックそれぞれ個別に設定することができます。さらに受信時のリアクションを選択することができます。

1.フィルタ対象文字列の追加

下記のように青色部分を追加します。

# Set your spam pattern
$COMMENT_PATTERN = 'char1|char2|…|charn|<h1>|<a\s'; # H1 or A elements
$TBPING_PATTERN = 'char1|char2|…|charn|<h1>|<a\s'; # H1 or A elements

char1 ? charn は任意のフィルタ文字列を設定します。文字列を複数配置する場合はサンプルのように "|" で区切ります。コメントでリンクを受け付けたい場合は、$COMMENT_PATTERN の "<a\s"(とその前の "|" )は削除してください。

2.フィルタ対象フォームエリアの追加

デフォルトでのフィルタ対象となるフォームエリアは、「コメントの内容」および「トラックバックの概要(=本文の先頭n文字)」となっていますので、「コメント投稿者」および「トラックバックタイトル」を追加するサンプルを記します。

use MT::Comment;
use MT::TBPing;
 
sub is_comment_spam {
    my $comment = shift;
    return ($comment->text =~ /$COMMENT_PATTERN/i ||
            $comment->author =~ /$COMMENT_PATTERN/i);
}
 
sub is_tbping_spam {
    my $tbping = shift;
    return ($tbping->excerpt =~ /$TBPING_PATTERN/i ||
            $tbping->title =~ /$TBPING_PATTERN/i);
}

今回のバージョンアップで他のエリアについても簡単に設定できるようにしてくださっているので、「全部入り(ラーメンか)」を希望される場合は下記のように設定すればOKです。

sub is_comment_spam {
    my $comment = shift;
    return ($comment->text =~ /$COMMENT_PATTERN/i ||
            $comment->author =~ /$COMMENT_PATTERN/i ||
            $comment->email =~ /$COMMENT_PATTERN/i ||
            $comment->url =~ /$COMMENT_PATTERN/i ||
            $comment->ip =~ /$COMMENT_PATTERN/i);
}
 
sub is_tbping_spam {
    my $tbping = shift;
    return ($tbping->excerpt =~ /$TBPING_PATTERN/i ||
            $tbping->title =~ /$TBPING_PATTERN/i ||
            $tbping->source_url =~ /$TBPING_PATTERN/i ||
            $tbping->blog_name =~ /$TBPING_PATTERN/i ||
            $tbping->ip =~ /$TBPING_PATTERN/i);
}

なお上に設定したものから順番にチェックし、文字列がマッチした時点で処理が終わる(=残りは実行されない)ので、優先度の高いものから並べると良いでしょう。

3.コメントスパム受信時のリアクション変更

ここでは正常に受け付けたように見せかける設定にしています。

# Choose a method for rejecting Spam Comments from: 
# 'CommentFilter', 'CommentThrottleFilter', 'CommentError',
# 'CommentLongError', 'CommentRedirect', 'CommentEvilRedirect'
$COMMENT_METHOD = 'CommentErrorCommentFilter';

4.トラックバックスパム受信時のリアクション変更

こちらも同様です。

# Choose a method for rejecting Spam Pings from:
# 'TBPingFilter', 'TBPingThrottleFilter', 'TBPingError'
$TBPING_METHOD = 'TBPingErrorTBPingFilter';
Comments [19] | Trackbacks [18]
2005年2月24日

コメントスパム対策(その6)

再び Ogawa::Memoranda さん提供のスパム対策プラグインに対し、下記の改変を行いました。

プラグイン:Quasi-Spam Filter Plugin 改変内容:コメントの投稿者(MTCommentAuthor)の文字列をフィルタ対象に加える

これまでのコメントスパムは本文にフィルタ文字列が含まれていましたが、数日前、本文ではなく投稿者にフィルタ文字列が含まれるスパムが10通ほど到来しました。プラグインは(コメントについては)本文のみのチェックとなっていますので、投稿者に設定された文字列もチェックするように改変してみました。

修正については、ソースを下記の赤字部分から青字のものに置き換えてください(2番目の赤字部分はさらに1行追加がありますのでご注意ください)。なお今回の改変コードはOgawaさんの案を頂きました。ありがとうございました。

sub comment_filter {
    my ($eh, $app, $comment) = @_;
    return !is_comment_spam($comment->text);
    return !is_comment_spam($comment->text . ' ' . $comment->author);
}
 
sub comment_throttle_filter {
    my ($eh, $app, $entry) = @_;
    my $comment = $app->{query}->param('text');
    my $author = $app->{query}->param('author');
    return !is_comment_spam($comment);
    return !is_comment_spam($comment . ' ' . $author);
}
 
sub comment_error {
    my $app = shift;
    my $q = $app->{query};
    my $mode = $q->param('__mode') || $app->{default_mode};
    return if $mode ne 'post';
    if (is_comment_spam($q->param('text'))) {
    if (is_comment_spam($q->param('text') . ' ' . $q->param('author'))) {
        $app->add_methods(post => sub { });
        $app->error("Spam Comment!");
    }
}
 
sub comment_long_error {
    my $app = shift;
    my $q = $app->{query};
    my $mode = $q->param('__mode') || $app->{default_mode};
    return if $mode ne 'post';
    if (is_comment_spam($q->param('text'))) {
    if (is_comment_spam($q->param('text') . ' ' . $q->param('author'))) {
        $app->add_methods(post => sub { $_[0]->handle_error("Spam Comments!") });
    }
}
 
sub comment_redirect {
    my $app = shift;
    my $q = $app->{query};
    my $mode = $q->param('__mode') || $app->{default_mode};
    return if $mode ne 'post';
    if (is_comment_spam($q->param('text'))) {
    if (is_comment_spam($q->param('text') . ' ' . $q->param('author'))) {
        $app->add_methods(post => sub { });
        $app->redirect($URL);
    }
}
 
sub comment_evil_redirect {
    my $app = shift;
    my $q = $app->{query};
    my $mode = $q->param('__mode') || $app->{default_mode};
    return if $mode ne 'post';
    if (is_comment_spam($q->param('text'))) {
    if (is_comment_spam($q->param('text') . ' ' . $q->param('author'))) {
        $app->add_methods(post => sub { });
        $app->redirect($q->param('url') || $URL);
    }
}

コメント画面からの投稿については動作の正常性をを確認しておりますが、適用に際しましては個人の責任で行ってくださいますよう、よろしくお願い致します。

Comments [11] | Trackbacks [9]
2005年1月31日

コメントスパム対策(その5)

January 31,2005 1:15 AM
Tag:[]
Permalink

約5ヶ月ぶりの対策です。
これまでの経緯は、コメントスパム対策(その3)で特定の文字列をエラーとする対処を行った後、コメントスパム対策(その4)を実施したのですが、通常のコメントでエラーが発生するようになってしまい、一旦全て元に戻しておりました。その後、大量のコメントスパムを頂く度に削除するという原始的な手法に陥ってましたがさすがにみっともないので今回、下記のプラグインを使わせて頂きました。

Ogawa::MemorandaQuasi-Spam Filter Plugin

個人的にコメントスパム対策は特定の文字列のみをエラーとするのが望ましいと思ってましたので、まさにうってつけのプラグインです。ありがとうございました。
使い方は簡単です。以下、引用です。

quasi-spamfilter.zipをダウンロードし、展開してください。次に中に含まれるquasi-spamfilter.plをMovable Typeのpluginsディレクトリーにアップロードしてください。以上です。

また、デフォルト状態では

# Set your spam pattern
our $PATTERN = '<h1>|<a\s'; # H1 or A elements

と h1 タグおよび a タグを対象とする設定となってますので、私は下記のように変更しています。

# Set your spam pattern
our $PATTERN = 'hoge1|hoge2|hoge3';

hogen が対象文字列です。文字列を"|"で区切ることで何文字でも設定できます。

このように特定かつ複数文字列を含んだコメントをフィルタリングすることができる他、その後のリアクションを変更することもできます。エラーにすることもできますし、特定のURLにリダイレクトさせることもできます。私はデフォルト状態で利用させていただいてますので、フィルタリングされたコメントはあたかも正常に受け付けられたかのように振る舞います。

ということで、もしコメント投稿後の個別エントリーアーカイブにコメントが反映されていなければフィルタリングされたと解釈ください(普段使われることのない文字列しかフィルタの対象にしてませんので大丈夫とは思いますが)。

Comments [10] | Trackbacks [9]
2004年9月 2日

コメントスパム対策(その4)

September 2,2004 12:05 AM
Tag:[]
Permalink

我楽さんのコメント投稿で500エラーが出るけど、投稿反映される件について。でアドバイス頂いた通り、mt-comments.cgiのファイル名変更してみました。これで様子をみてみたいと思います。ありがとうございました。

Comments [1] | Trackbacks [0]
2004年9月 1日

コメントスパム対策(その3)

September 1,2004 12:45 AM
Tag:[]
Permalink

再びオンラインカジノからコメントスパム頂きましたので次の対策を打ってます。ちなみに前回より私が行っている対策はコメントに特定の文字列が入力された時だけエラーにするというものです。多分「kasino」とか変な日本語混ぜてまた来るんでしょうね…。

Comments [0] | Trackbacks [1]
2004年8月27日

コメントスパム対策(その2)

August 27,2004 1:00 AM
Tag:[]
Permalink

半角英数のみのコメントをエラーとする対処にしていましたが、本文に「オンラインカジノ」と書かれたコメントスパムを3件頂きました(削除済)。
という訳で現在新たな対処を盛り込んでいます。不具合等ございましたらお許しください。

Comments [0] | Trackbacks [0]
2004年8月19日

コメントスパム対策

August 19,2004 1:31 AM
Tag:[]
Permalink

ようやく取りかかりました。

  • コメントスパムを削除する手間が面倒
  • コメンターの方への入力文字制限をしない

というポリシーで、当初我楽さんのコメントスパム、補足というか・・・。経由で女子十二月号さんのMovableTypeコメントスパム対策をと思いましたが、コメントプレビューテンプレートでユーザ定義のhiddenタグが引き継げない(スキル不足?)ことが発覚し、今のところMagic WhiteさんのTypeKey対応などなどスパム対策経由できままにポロポロさんの続々コメントスパムを参考にさせて頂いて、半角英数のみのコメントをエラーとする対処にしています。

Comments [17] | Trackbacks [2]
Now loading...
Introduction
List of "コメントスパム"
Recent Entries
Recent Comments
Recent Trackbacks
QRcode

現在停止中です
携帯電話からこのQRcodeを撮影することで携帯用URLを取得することができます

URI for cellular phones
ギターに入った猫
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

loading ...
Categories
Monthly Archives
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
クリエイティブ・コモンズ・ライセンス
Powered by
Movable Type 5.02