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]
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