2005年05月24日

コメントスパム対策 2 MTHash編

コメントスパム対策として以前、MT-DSBLを導入しました。
 これは、Open Proxy からの登録を拒否する仕組みなんですがこれをくぐってくる輩もおり、新たな対策をしようと考えました。

結構、対策はあるのですが私の選んだのはこれ、
 
MTHash
http://golem.ph.utexas.edu/~distler/blog/archives/000383.html

これは、コメントを投稿しようとするときに一度プレビューにしてからでないと投稿できないようにしようというものです。
 実際の投稿をしてもらうときもプレビューしないといけないわけですが、それはそうしていただくということで、、、

んで導入方法(MTHashの英文を私なりに解釈。)

1、MTHashのダウンロード&salt.txtの作成
http://golem.ph.utexas.edu/~distler/blog/archives/000383.htmlでソースコードが提供されていますのでそれを「MTHash.pl」として保存。
MTHashでリンクが張られていますのでそれを探してください。
・自分で「salt.txt」というテキストファイルを作成。中身は任意の文字列(半角英数字)を書き込み保存してください。

上記2点のファイルをMTのpluginsディレクトリにアップロード。

2、プラグインを反映させるためにテンプレートの編集。
  (メモ帳などに元のテンプレートを保存しておくことをおすすめします)
・Comment Preview Template(コメントプレビューテンプレート)を開き、以下の分を追加。

<input type="hidden" name="validated" value="<MTSHA1SaltHash><MTCommentPreviewBody convert_breaks='0'><$MTEntryID$><MTCommentPreviewIP> <$MTCommentPreviewAuthor$><$MTCommentPreviewEmail$>< $MTCommentPreviewURL$></MTSHA1SaltHash>" />
 コメント登録フォームの部分に追加するので、<MTIfCommentsAllowed> </MTIfCommentsAllowed>の間に追加する。(投稿ボタンとかプレビューボタンの記述場所)

3、コメントスクリプトの修正。
  lib/MT/App/Comments.pm
  lib/MT/Template/Context.pm
を修正します。(これもまたコピーをどこかにとっておくことをおすすめします)

hoge/lib/MT/Template/Context.pm

1200行目過ぎくらい。(前後数行ずれると思いますので [if ($cookies && $cookies->{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 ($registration_allowed || $unregistered_allowed) {
$javascript = <<JAVASCRIPT;

の間。

require Digest::SHA1; my $sha1 = Digest::SHA1->new; $sha1->add( $entry_id . $ENV{'REMOTE_ADDR'} ); my $salt_file = MT::ConfigMgr->instance->PluginPath .'/salt.txt'; my $FH; open($FH, $salt_file) or die "cannot open file <$salt_file> ($!)"; $sha1->addfile($FH); close $FH; my $comment_validated = $sha1->b64digest . "=";


1300行目過ぎくらい。
<p><label for="text"><MT_TRANS phrase="Comments:"></label> $allow_comment_html_note<br />
<textarea tabindex="4" name="text" rows="10" cols="50" id="text">$comment_text</textarea></p>


<div align="center">
<input type="submit" name="preview" value="&nbsp;<MT_TRANS phrase="Preview">&nbsp;" />
<input style="font-weight: bold;" type="submit" name="post" value="&nbsp;<MT_TRANS phrase="Post">&nbsp;" />
</div>

の間に


 <input type="hidden" name="validated" value="$comment_validated" /> 
を記述し保存。

hoge/lib/MT/App/Comments.pm

250行目付近。
if (!$q->param('text')) {
return $app->handle_error($app->translate("Comment text is required."));
}


my ($comment, $commenter) = _make_comment($app, $entry);
の間に

require Digest::SHA1; my $sha1 = Digest::SHA1->new; $sha1->add( $entry_id . $ENV{'REMOTE_ADDR'} ); my $salt_file = MT::ConfigMgr->instance->PluginPath .'/salt.txt'; my $FH; open($FH, $salt_file) or die "cannot open file <$salt_file> ($!)"; $sha1->addfile($FH); close $FH; my $digest = $sha1->b64digest . "="; if ($q->param('validated') ne $digest) { return $app->handle_error($app->translate( "Please preview your modified entry before posting it.")); }
を記述して

2点をそれぞれアップロード。

  これでOKです。   テストを兼ねて、コメントを投稿してみるとエラーになれば成功です。

最後に、Individual Archives Templete(個別エントリーアーカイブのテンプレート)の投稿ボタンを削除します。
 あると、紛らわしいので削除しておくのがベター。

 <input style="font-weight: bold;" type="submit" name="post" tabindex="10" value="&nbsp;投稿&nbsp;" />
このような感じで記述されているはずです。

青文字の4つで確認してください。 

これで作業完了です。

最後にテンプレートを編集したので、再構築が必要になります。
 個別エントリーアーカイブの再構築を行ってください。
 個別エントリーの画面から投稿ボタンが消えていることを確認して SPAM対策は終了です。




≪関連記事≫
コメントスパム・トラックバックスパム
blank_space
投稿者 星探 : 2005年05月24日 18:31