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]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

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


AMN
Categories
Monthly Archives
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3