MT-SCode プラグインによるコメントスパム対策(その2:Typekeyサイン・インとの競合制御)
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);
- mt-config.cgi のアクセス制限について
- MT-SCode プラグインによるコメントスパム対策(その1)
- コメントスパム対策(その6)
- コメントスパム対策(その5)
- コメントスパム対策(その4)
- コメントスパム対策(その3)
- コメントスパム対策(その2)
- コメントスパム対策
≫ スパムとの戦いその後 from 倖 *Happiness Blog*
前々回スパムとの戦いにおいてTypekey認証されて居る場合はコメント投稿時にセ... [続きを読む]
≫ mt-site.jsがない from ピヨログ
こないだから気になっていたコメント投稿欄の上に「TypeKey ID を使って サイン・... [続きを読む]
≫ ブログスパム ~探検82日目~ from 裏情報探検
ブログスパム [続きを読む]
先日はご来訪有難う御座いました!
お陰様でTypekey認証時の競合を回避できました。
MT-SCode プラグインも効果を発揮しているのか、スパムコメントも回避出来て居るようです。
色々お手数をお掛けしました、これからも頑張ってくださいませ!
>NK Lastroseさん
こんばんは。
こちらの方も参照くださりありがとうございました。またトラックバックありがとうございます。
Typekey競合まで考慮した組み合わせはなかなかGOODだと思います。
こちらこそ今後ともよろしくお願い致します。