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

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

Posted at May 24,2005 8:03 PM
Tag:[Comment, Customize, MovableType, MT-SCode, Plugin, SecurityCode, Spam]

前回の記事では原文にもとづいたカスタマイズ(+公開テンプレートに合わせた修正)を行いましたが、そのままの状態では 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);
関連記事
zenback
人気エントリー
トラックバックURL


トラックバック

スパムとの戦いその後 from 倖 *Happiness Blog*
前々回スパムとの戦いにおいてTypekey認証されて居る場合はコメント投稿時にセ... [続きを読む]

Tracked on May 30, 2005 12:03 AM

mt-site.jsがない from ピヨログ
こないだから気になっていたコメント投稿欄の上に「TypeKey ID を使って サイン・... [続きを読む]

Tracked on December 3, 2005 9:08 PM

ブログスパム ~探検82日目~ from 裏情報探検
ブログスパム [続きを読む]

Tracked on December 26, 2005 11:28 AM
コメント

先日はご来訪有難う御座いました!
お陰様でTypekey認証時の競合を回避できました。
MT-SCode プラグインも効果を発揮しているのか、スパムコメントも回避出来て居るようです。
色々お手数をお掛けしました、これからも頑張ってくださいませ!

[1] Posted by NK Lastrose : May 30, 2005 1:47 AM

>NK Lastroseさん
こんばんは。
こちらの方も参照くださりありがとうございました。またトラックバックありがとうございます。
Typekey競合まで考慮した組み合わせはなかなかGOODだと思います。

こちらこそ今後ともよろしくお願い致します。

[2] Posted by yujiro : May 30, 2005 6:14 PM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)