SbCodeプラグイン - 技術情報
Category : MTplugin
SbCodeプラグインの技術情報を(公開できる範囲で)公開します。
SbCodeプラグインで提供するオリジナル・テンプレートタグの解説もこの記事で行います。
※【2007/03/08 v0.2バージョンアップに伴う追記・修正】
SbCodeプラグインの仕組み
SbCodeプラグインのコメントスパムフィルターとしての仕組みは、簡単にまとめると以下のようになります。
- コメント投稿フォームに、現在日時(表示時、秒単位)をハッシュ化した数値を隠しフィールド(<input type="hidden" ~/>)として追加
- コメント投稿時に、上記ハッシュからフォーム表示日時を割り出し、現在日時(投稿時)との間隔が指定期間内ならばOK
- TypeKey認証済みのユーザならばハッシュの評価無しで無条件にOK
- 設定でSbCodeを無効にしている場合も評価せずOK
- もちろん、SbCodeのハッシュが送信内容に含まれていなければ無条件にNG
つまりCaptchaプラグイン等のよくあるコメントスパム対策プラグインとの違いは、そういった「特殊コード」の入力をユーザにさせていない、ということになります。
そう言う点では、Captchaプラグインのように「大抵の人間には容易に解答できるがプログラムでは簡単に解けないようなテスト」を課しているわけではないので、スパム対策としては多少(かなり?)弱くなります。
(この点に関しては、将来的には「ユーザに入力してもらうフィールドも表示する」ような拡張を考えています。)
なお、ハッシュ化の仕組みは独自仕様です。
とは言え、ソースは閲覧できる(Perlなので)ので、解析は難しくないかもですけれど(汗)
隠しフィールドを埋め込む仕組み
<$MTSbCode$>タグは、上記の独自ハッシュコードを値として持つ隠しフィールド(<input type="hidden" ~/>)をHTMLソースに埋め込むためのものです。
ソースに埋め込む方法は、以降に示すように複数の方法を用意しており、必要に応じて選択されます(もしくは適宜指定することができます)。
なお、複数の方法を用意した理由は、以下の通りです:
- JavaScript必須にしたくなかった。
(JavaScriptを使用しない(できない)閲覧者をコメント投稿対象者から除外しない選択肢を用意したかった)
JavaScriptを使用する方法
<$MTSbCode$>を、type属性を指定せずに使用した場合のデフォルトの方法です。
明示的に type="js" と指定しても同じです。
v0.2からは、ダイナミック・パブリッシングの場合もデフォルトはこの方法になります。
この場合、<$MTSbCode$>タグは、以下のようなスクリプト・タグを生成します。
<script type="text/javascript" src="http://[ホスト]/[MTパス]/plugins/SbCode/SbCode.cgi?mode=js"></script>
また、CGIプログラム SbCode.cgi は、コメント投稿フォームを表示するたびに以下のようなソースを吐き出します。
document.write('<input type="hidden" name="SbCode" id="SbCode" value="[生成されたハッシュコード]" />');
これにより、最終的にHTMLに隠しフィールドが埋め込まれます。
PHPを使用する方法
<$MTSbCode$>に type="php" と指定した場合の方法です。
この場合、<$MTSbCode$>タグは、以下のようなPHPタグを生成します。
<?php include('http://[ホスト]/[MTパス]/plugins/SbCode/SbCode.cgi?mode=php') ?>
また、CGIプログラム SbCode.cgi は、コメント投稿フォームを表示するたびに以下のようなソースを吐き出します。
<input type="hidden" name="SbCode" id="SbCode" value="[生成されたハッシュコード]" />
これにより、最終的にHTMLに隠しフィールドが埋め込まれます。
なおこの方法は、サーバでPHPの使用が有効で、かつエントリー・アーカイブをPHPファイルとして出力(拡張子に .php を指定)している場合のみ有効です。
※ダイナミック・パブリッシングの場合は無効です。
SSIを使用する方法
<$MTSbCode$>に type="ssi" と指定した場合の方法です。
この場合、<$MTSbCode$>タグは、以下のようなSSIタグを生成します。
<!--#include virtual="http://[ホスト]/[MTパス]/plugins/SbCode/SbCode.cgi?mode=ssi" -->
また、CGIプログラム SbCode.cgi は、コメント投稿フォームを表示するたびに以下のようなソースを吐き出します。
<input type="hidden" name="SbCode" id="SbCode" value="[生成されたハッシュコード]" />
これにより、最終的にHTMLに隠しフィールドが埋め込まれます。
なおこの方法は、サーバでSSIの使用が有効で、かつエントリー・アーカイブをSSIの実行を許可されたHTMLファイルとして出力している場合のみ有効です。
※ダイナミック・パブリッシングの場合は無効です。
直接隠しフィールドを埋め込む方法
<$MTSbCode$>に type="dynamic" と指定した場合の方法です。
また、コメント・プレビュー、コメント・エラーの各テンプレートに<$MTSbCode$>を記述した場合、およびダイナミック・パブリッシングでエントリーページを表示している場合等にも自動的にこの方法が使用されます。
この場合、<$MTSbCode$>タグは、以下のようなinput要素タグを直接生成します。
<input type="hidden" name="SbCode" id="SbCode" value="[生成されたハッシュコード]" />
これにより、HTMLに隠しフィールドが埋め込まれます。
※この方法は、このinput要素タグを生成した時点の日時をもとにハッシュコードを算出し埋め込むモノです。よってダイナミック・パブリッシングやコメントプレビュー以外の場合には使用しないでください。
※v0.2からは、ダイナミック・パブリッシングの場合でも明示的に type="dynamic" を指定しないと有効になりません。またこの時、エントリーページに対してキャッシュをオフにしてください。(Thanks for oscar)
※Perl版ダイナミック・パブリッシングをご使用の場合に有効です。
提供するオリジナル・テンプレートタグの解説
- <$MTSbCode$>
- SbCodeのハッシュコードを持つ隠しフィールドを埋め込む変数タグ。
以下の属性が指定できます:- type
- 隠しフィールドを埋め込む方法を指定します。
指定無しの場合は、"js"が指定されたモノとして扱われます。
以下の属性値が設定できます:
、およびダイナミック・パブリッシング環境で使用した場合は、属性の指定関わらず常に「dynamic」モードになります。 - <$SbCodeValue$>
- SbCodeのハッシュコードを出力する変数タグ。
- <$SbCodeCGIPath$>
- SbCodeのハッシュコード、もしくはハッシュコードを埋め込むタグを出力するCGIプログラムのURLを出力する変数タグ。
<$SbCode$>タグと同じ属性が指定できます。





コメント
こんにちは、あんちもん2.Labさんのプラグインをいろいろ使わせていただいています。
また、いつもmixiでのご活躍を拝見させていただいています。
現在ダイナミック・パブリッシングで、エントリーアーカイブを表示しているのですが、ページキャッシュの使用は、やはり問題になりそうに思います。このプラグインを動的生成で使用する場合、エントリーに対してはキャッシュオフになるようにしなくてはならないと思いますが、どうでしょうか。
こんばんは>oscarさん
こちらこそ、ブログをよく拝見させていただいております。
ページキャッシュは問題になりそうですね。
検証しようとしたのですが、手元の検証環境でエラーが発生してしまい(汗)検証できずにいます。
明確な回答は少々お待ちください。
確認できました。
確かにダイナミック・パブリッシングの場合でキャッシュが有効だと、前に生成されたSbCodeがそのまま使用されてしまいますね。
ページの再読込([F5])を一度でも実行すれば再生成してくれるんですけれど。
エントリーは通常固定ページ(パーマリンク)になるので、キャッシュオフというのもどうかと思いますし。
ということで、ダイナミック・パブリッシングの場合もオプションで埋め込み方法を選べ、デフォルトはJavaScript使用になるよう修正します。
近日中に対応します。
確認ありがとうございました。やはりでしたか。
お手数をおかけします。
>※v0.2からは、ダイナミック・パブリッシングの場合でも明示的に type="dynamic" を指定しないと有効になりません。
早っ!
早速試してみます。
ありがとうございました。
コメントする