プレビューボタンのみ表示してhashを仕込むというコメントスパム対策(改造版)
2004.07.07 Wednesday 15:13
毎日投稿されるコメントスパムにいいかげんうんざりしましたので、対策をしました。
前々から、これいいじゃないかと思っていたので、早速私も導入してみました。
しかし、Digest::SHA1ライブラリがないというエラーが出てそのままの導入では無理でした。
そこで、Digest::SHA1を使用しないでDigest::MD5を使用するよう改造してみました。
Going My Way: プレビューボタンのみ表示してhashを仕込むというコメントスパム対策
コメントスパムにはいろいろ対策をしていますが効果のありそうなものを見つけたのでちょっとMTを改造してみました。
これはMusings: Forcing Comment Previewsで紹介されていた方法で、コメントをいきなりPostすることを許可せずにプレヴューしないとPostできないようにするという方法です。そしてプレビュー画面にhashでランダムに表示させたキーをhidden属性に入れておくことでこれが入っていない場合投稿できなくすると言うものです。それでは改造方法。わりと簡単でした。
前々から、これいいじゃないかと思っていたので、早速私も導入してみました。
しかし、Digest::SHA1ライブラリがないというエラーが出てそのままの導入では無理でした。
そこで、Digest::SHA1を使用しないでDigest::MD5を使用するよう改造してみました。
導入手順
1.MTHashMD5.pl.txtをダウンロードして、MTHashMD5.plという名前でMTのpluginsディレクトリに入れてください。
2.(追記)salt.txtというファイルを作成し、内容はテキストで貴方の好きなキーワード(英数字)をいれてください。そのファイルをMTのpluginsディレクトリに入れてください。
3. Comment Preview Templateに下のタグを追加します。
<input type="hidden" name="static" value="<$MTCommentPreviewIsStatic$>" />
の次行がいいと思います。
4.lib/MT/App/Comments.pmファイル(159行目あたり)を修正します。日本語のコードはMTの日本語パッチをあてた文字コードに統一してください。
5.あとは、プレビュー後に投稿してもらうように
・Individual Entry Archive
・Comment Listing Template
</form>の次に
を追加するとよいでしょう。
6.(追記)テストコメントを作成し、プレビューせずに投稿をしたときに「投稿する前に必ずプレビューをして内容を確認してください。」とでることを確認の上、postボタンの表示をコメントにしましょう。
・Individual Entry Archive
・Comment Listing Template
を
こんな感じでコメントにして隠すとよいでしょう。
1.MTHashMD5.pl.txtをダウンロードして、MTHashMD5.plという名前でMTのpluginsディレクトリに入れてください。
2.(追記)salt.txtというファイルを作成し、内容はテキストで貴方の好きなキーワード(英数字)をいれてください。そのファイルをMTのpluginsディレクトリに入れてください。
3. Comment Preview Templateに下のタグを追加します。
<input type="hidden" name="validated" value="<MTMD5SaltHash><MTCommentPreviewBody convert_breaks='0'><$MTEntryID$><MTCommentPreviewIP></MTMD5SaltHash>" />
<input type="hidden" name="static" value="<$MTCommentPreviewIsStatic$>" />
の次行がいいと思います。
4.lib/MT/App/Comments.pmファイル(159行目あたり)を修正します。日本語のコードはMTの日本語パッチをあてた文字コードに統一してください。
if (!$q->param('text')) {
return $app->handle_error($app->translate("Comment text is required."));
}
# ここから
use Digest::MD5 qw(md5_hex);
my $content = "";
$content .= $q->param('text');
$content .= $q->param('entry_id');
$content .= $user_ip;
my $salt_file = MT::ConfigMgr->instance->PluginPath .'/salt.txt';
open(FH, $salt_file) or die "cannot open file <$salt_file> ($!)";
while (<FH>) {
$content .= $_;
}
close FH;
my $digest = md5_hex($content) . "=";
if ($q->param('validated') ne $digest) {
return $app->handle_error($app->translate(
"Please preview your modified entry before posting it.(投稿する前に必ずプレビューをして内容を確認してください。)"));
}
# ここまでを追加
my $comment = MT::Comment->new;
5.あとは、プレビュー後に投稿してもらうように
・Individual Entry Archive
・Comment Listing Template
</form>の次に
※コメントスパム対策のため、プレビュー後、投稿願います
を追加するとよいでしょう。
6.(追記)テストコメントを作成し、プレビューせずに投稿をしたときに「投稿する前に必ずプレビューをして内容を確認してください。」とでることを確認の上、postボタンの表示をコメントにしましょう。
・Individual Entry Archive
・Comment Listing Template
を
<input type="submit" name="preview" value=" Preview " />
<!--
<input style="font-weight: bold;" type="submit" name="post" value=" Post " /><br /><br />
//-->
こんな感じでコメントにして隠すとよいでしょう。

Comments
早速プレビューしないでポストして見ます。(笑)<br />
警告文が出ましたよ。(汗)
いきなりの投稿は警告がでますので、ボタンを隠すことにしました。
コメントスパムに困っておりまして、hashを仕込むというのを導入しましたが、エラーがでます。<br />
<br />
プリントアウトして、見ながらしたのですが、うまく導入できません。<br />
アドバイス、お願いできないでしょうか?<br />
メールもしたのですが、はじかれます。
エラーメッセージを拝見しました。<br />
>An error occurred: Can't locate Digest/MD5.pm in @INC <br />
というのは、@INC の設定のディレクトリにDigest/MD5.pmというライブラリファイルがないというエラーです。<br />
@INC の設定のディレクトリとは、次の<br />
>/usr/local/httpd/htdocs/www6/arisu/public_html/blog/extlib <br />
>/usr/local/httpd/htdocs/www6/arisu/public_html/blog/lib <br />
>/usr/local/lib/perl5 /usr/local/lib/perl5/site_perl <br />
>/usr/local/lib/perl5/site_perl<br />
>. (カレントディレクトリ)<br />
のどれにもないようなので、それらのパスにあうようにDigest/MD5.pmを自分で設置する必要があります。<br />
確実なのは私に聞くよりもAirnetさんのサポートを受けることでしょう。今回の改造のようなことができないプロバイダがあるかもしれませんので。
単純な記載ミス等によるエラーではなかったのですね。<br />
<br />
>パスにあうようにDigest/MD5.pmを自分で設置する必要があります。<br />
<br />
今のアリスのレベルでは、ちょっとむずかしいです。<br />
もっと勉強します。<br />
ありがとうございました。m(__)m
最後のボタン設定がおかしいのか、プレビュー後に<br />
投稿してもエラーが出ます。<br />
4の「MTの日本語パッチをあてた文字コードに統一」が<br />
どこか書き換える場所があるのかどうか、わかりません。<br />
間違っているところがあれば、ご教授いただきたいのですが。。
はてさんのサイトはEUC-JPの日本語パッチをお使いのようですから、日本語をEUC-JPの文字コードで入力が可能なエディタを使って、EUC-JPで保存してください。(メモ帳ではだめです)<br />
もし、どうしてもわからないなら、日本語部分を削除すれば、いかがかと。(ただし利用者は英語メッセージでは理解不能になって、コメント書けないとクレームくるかもしれませんが)
保存時のコードの選択ができるようで、EUCにして保存。<br />
改行コードもLFにして保存FTPしましたが、やはり同じようにエラーが出ます。<br />
要領が悪くて、何度か上書きしたからでしょうか。。<br />
<br />
>(投稿する前に必ずプレビューをして内容を確認してください。)<br />
この日本語部を消しても見ましたが、やはりエラーで書き込めません。<br />
誠に申し訳ありませんが、何か策はありませんか?
エラーメッセージは何ですか?<br />
エラーメッセージから対処法はわかりませんか?
<br />
エラー文はタイシタモノでないので、わかりかねています。<br />
今まで頂いたコメントの返事に入力していた名前・メアド・URLを入れたままなので、特にいじった形跡がないのです。<br />
<br />
>コメントの登録が失敗しました:<br />
>You are not allowed to post comments.<br />
>フォームへの入力エラーです。直してから「投稿」を押してください
IPBANリストの処理でのエラーメッセージです。<br />
IPBANリストいじっていませんか?<br />
そのリストで全IPアドレスをはじくようなことしていませんか?<br />
>特にいじった形跡がないのです。<br />
とのことですが、あなたのサイトのエントリではココの内容を適応する前にIPリストを修正しているとエントリでかかれていますが。<br />
ここのエントリの対策を一旦もどしてみればわかると思いますよ。<br />
原因がどの修正によるものか。<br />
<br />
バックアップ取りましょうとは書いていませんが、よくわからないものに対して修正を加える場合は、バックアップとってから修正するのは基本ですので。(よくわかっているものでもバックアップは普通とりますけどね)
先に設定していた禁止IPを全部消してテストしてみたら、投稿できました・・・原因わからず(汗<br />
IPの禁止は、Web上にあったIPBanリストを参考にし、MT編集画面より禁止IPの入力の画面で操作しただけで、<br />
全IPを禁止するなどするはずもなく、何もしていません。わたしの現IPを登録するわけもないですし・・・。<br />
とりあえず投稿できるまま、IPの方を確認してみます。<br />
いろいろお騒がせしまして申し訳ありませんでした。感謝いたします。
つまりは全IPからの投稿ができなかったものと思われます。<br />
IPBANリストというのは、正規表現での登録が可能ですので、<br />
誤って全IPをはじく条件を登録してしまったのではないかと考えられます。<br />
(エラーメッセージの個所から、それ以外考えられません)<br />
<br />
いろいろな種類の対策をとるときは、ひとつづつ確認しましょうということです。一度にやってしまうと、詰まった時に何が原因なのかわからなくなってしまいますから。
今朝15分間の間に65個ものカジノ誘導のスパムを受けてしまいました。
ワンタイムパスワードっぽいものに挑戦しようかと調べていたら近い発想だなぁと思って投稿されてしまいました。すみません。
過去のコメントで「はて」さんが首をひねっておられますが、これはコメントを連続して投稿したためにスパムとみなされ、禁止IPに加えられたのだと思います。解決済みのことかもしれませんが、参考までに。
ご連絡ありがとうございます。
3つのブログサイトを運営しているので少し手間になりましたが、いたって簡単でした。何も問題なく対策できました。ありがとうございます。
なかなか良い解決策ってないもんですね。
管理人様は、コメントスパム、解消されましたか?
ただ、人工無脳酢鶏からのコメントはありましたので、この方法も送信側が対策しようと思えばできるかと思います。
Comment Form