SCode プラグインでコメントスパムを制限する(その2:Typekeyサイン・インとの競合制御)
![]() |
![]() 3.1x 時代に MT-SCode を紹介した時に同じカスタマイズを行っていたのですが、質問を頂いて思い出しました。全く忘却の彼方でした。すいません。 |
以下、カスタマイズ方法です。注:カスタマイズは、その1:基本設定で SCode プラグインの設定が完了していることが前提となります。
1.テンプレートの修正
管理メニューより個別エントリーアーカイブテンプレートを開き、前回の4項で追加したセキュリティコード表示部分に対して、青色で示す id 属性および JavaScript を追加します。この追加によりサイン・イン状態を判定して、サイン・イン状態であればセキュリティコード入力エリアを表示しないようになります。
<p id="securitycode">
<label for="scode">Security Code:</label>
<input type="hidden" id="code" name="code" value="<$MTSecurityCode$>" />
<img class="scode" src="<$MTCGIPath$><$MTSecurityImage$>?code=<$MTSecurityCode$>" /><input id="scode" name="scode" />
</p>
<MTIfNonEmpty tag="MTTypeKeyToken">
<script type="text/javascript">
<!--
if (commenter_name) {
document.getElementById('securitycode').style.display = 'none';
}
// -->
</script>
</MTIfNonEmpty>
コメント・プレビュー画面やコメント・エラー画面にコメントフォームを表示し、SCode を適用している場合、同様の修正を行ってください。
2.プラグイン の修正
1項の作業は画面上セキュリティコードを非表示にするだけなので、これでコメントを投稿するとセキュリティコードが入力されていない状態と同じです。
ということで、cookie に保持されているサイン・イン状態を取得・判定して、サイン・インされていればセキュリティコードチェックを実施しない処理を追加します。
アップロードした SCode プラグインのディレクトリにある plugins/SCode/SCode.pl をダウンロードし、下記のパッチ、
--- SCode.pl.bak Wed May 31 01:40:56 2006
+++ SCode.pl Wed May 31 01:42:15 2006
@@ -174,11 +174,20 @@
my $scode = $q->param('scode');
my $sscode = SCode::scode_get($code);
- if ($scode ne $sscode) {
+ 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) {
my $score = -3;
my $msg = "Comment junked due to incorrect code entered";
return ($score, [$msg]);
- }
+ }
+ }
SCode::scode_delete($code);
SCode::scode_create($code);
}
@@ -196,8 +205,18 @@
my $code = $q->param('code');
my $scode = $q->param('scode');
my $sscode = SCode::scode_get($code);
- if ($scode ne $sscode) {
- return 0;
+
+ 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 0;
+ }
}
SCode::scode_delete($code);
SCode::scode_create($code);
をあてます。
パッチのあて方が分からない場合は、ダウンロードした SCode.pl を任意のエディタで開き、下記の青色部分を追加してください。
if($config->{action} == 1 && $blog_config && $blog_config->{scode_enable} == 1) {
my $code = $q->param('code');
my $scode = $q->param('scode');
my $sscode = 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) {
my $score = -3;
my $msg = "Comment junked due to incorrect code entered";
return ($score, [$msg]);
}
}
SCode::scode_delete($code);
SCode::scode_create($code);
:
(中略)
:
my $code = $q->param('code');
my $scode = $q->param('scode');
my $sscode = 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 0;
}
}
SCode::scode_delete($code);
SCode::scode_create($code);
SCode.pl を修正したら元のディレクトリにアップロードしてください。
以上です。
これでサイン・インを行うとセキュリティコードが非表示・無効になります。
2006.05.31 追記
Junk Comment に設定した場合に有効にならない不具合がありましたのでパッチおよび改変内容を修正しました。
SCode プラグインでコメントスパムを制限する(その1:基本設定)
以前、MT-SCode プラグインによるコメントスパム対策(その1)という記事をエントリーしたのですが、3.1x用のカスタマイズだったため、3.2用のカスタマイズについてご紹介します。プラグインも SCode という名称になり、旧エントリーで紹介したものからバージョンアップされています。 このプラグインを利用するには GD Graphics Library または GD Perl Module がインストールされている必要があります。さくらレンタルサーバの場合はインストールされているようですが、サポート状況についてはご自身でご確認ください。 |
コメントスパム対策は Ogawa::memoranda さんの「Captcha Plugin」もあります。
またトラックバックスパムに困っている方は「asciiTBPingfilter プラグイン」をご利用ください。
1.プラグインのダウンロード
下記のサイトより SCode プラグインをダウンロードします。
ダウンロードのリンクは Installation にある「plugin」です。
2.プラグインのアップロード
ダウンロードしたアーカイブを解凍すると php および plugins ディレクトリがありますので、そのままMTの php ディレクトリおよび plugins ディレクトリへ、下記の構成になるようにアップロードします。
- php/plugins/~
- plugins/SCode/~
アップロード後、plugins/SCode/mt-scode.cgi のパーミッションを 755 等に変更してください。
すべてアップロードした後、Movable Type 管理画面のメイン・メニューの右側にあるシステムメニューの「プラグイン」をクリックして「SCode」が表示されればインストールOKです。
3.プラグインの設定
プラグインを有効にするために2ヶ所設定する必要があります。
|
- Temp Directory:
- セキュリティコードを保存するためのディレクトリ。Movable Type から書き込みできるパーミッションが必要です。このディレクトリは ドキュメントルート(public_html) より上位に設定します。そうでなければスパムロボットはディレクトリの中を参照し、入力すべきセキュリティコードを解読するおそれがあります。注:最後に必ず "/" を付与してください。
- Length:
- セキュリティコード長(デフォルトは6桁)
- Max Temp Files:
- Temp Directory に保存する最大ファイル数(デフォルトは50)。このファイル数がセキュリティコードのバリエーションに等しくなると思われます。つまり50ファイルであれば、各エントリーに50パターンのセキュリティコードが割り当てられます。なお1エントリーに割り当てられるセキュリティコードは一つで、再構築を契機に再割り当てされます(動的にコードが割り当てられるものではありません)。
- Action:
- セキュリティコード認証エラー時のアクション(コメント拒否または迷惑コメントとして受け付ける)
設定したら「変更を保存」をクリックします。
|
4.テンプレートの修正
エントリー・アーカイブおよびコメント・プレビュー等のコメント入力フォームにセキュリティコード用のタグ(青色)を追加します(公開テンプレートの設定例です)。
:
<p>
<label for="comment-bake-cookie"><input type="checkbox"
id="comment-bake-cookie" name="bakecookie" tabindex="9" accesskey="r" onclick="if (!this.checked) forgetMe(document.comments_form)" value="1" onkeypress="if (!this.checked) forgetMe(document.comments_form)" />
情報を保存する?</label>
</p>
<p>
<label for="scode">Security Code:</label>
<input type="hidden" id="code" name="code" value="<$MTSecurityCode$>" />
<img class="scode" src="<$MTCGIPath$><$MTSecurityImage$>?code=<$MTSecurityCode$>" /><input id="scode" name="scode" />
</p>
</div>
<p id="comments-open-text">
<label for="comment-text">コメント:<MTIfAllowCommentHTML>(スタイル用のHTMLタグが使えます)</MTIfAllowCommentHTML></label>
<textarea id="comment-text" name="text" tabindex="10" accesskey="t" rows="10" cols="30"></textarea>
</p>
:
なお上記のタグの代わりに
<MTSCodeInsert>
を記述するだけで同様のタグに置き換えてくれます。ただし、改行タグ等が含まれるのでレイアウトをきちんとしたい場合は上の設定を推奨します。
|
|
5.CSS設定
4項の状態では画像とセキュリティコード入力エリアのレイアウトが揃っていないため、スタイルシートに下記のようなセレクタを追加します(公開テンプレートの設定例です)。
.scode {
vertical-align: top;
}
#scode {
margin-left: 5px;
}
|
6.セキュリティコードのサイズ変更
5項までの設定で完成ですが、セキュリティコードの画像の高さを狭くしてテキスト入力エリアと高さを揃えたい場合、plugins ディレクトリにある SCode.pm のコードを下記のように変更すれば画像サイズを修正することができます。赤色の値を青色にそれぞれ変更してください。
なおこの項目を無理に実施する必要はありません。
my $im = new GD::Image($im_length,2518);
# define the color we going to use
my $c_background = $im->colorAllocate(224,224,224);
my $c_border = $im->colorAllocate(0,0,0);
my $c_line = $im->colorAllocate(192,192,192);
my $c_code = $im->colorAllocate(128,128,128);
# Fill in the background
$im->fill(50,50,$c_background);
# Draw the borders lines
for (my $i=0;$i<$im_length;$i+=5) {
$im->line($i,0,$i,2417,$c_line);
}
for (my $i=0;$i<25;$i+=5) {
$im->line(0,$i,$im_length-1,$i,$c_line);
}
$im->rectangle(0,0,$im_length-1,2417,$c_border);
# Write the code
$im->string(gdGiantFont,8,51,$scode,$c_code);
|
2006.05.13 追記
3項の Temp Directory について、末尾に "/" 付与を追記しました。