前回に引き続き、スパム対策の話題です。
利用時になるべく不便を感じさせず、かつスパマー側の対応に手間がかかる手段というと、今のところJavascriptを上手に利用するのが一番効果的。ということで、そっち関係のプラグインをチェック。 NP_JSEncodeNP_ProtectByMD5のレビューです。

NP_JSEncode

スキンに始点・終点を記述することで、その範囲の英数字を自動で%XXの形に変換。Javascriptで復元する仕組みになってます。これを使ってフォームに対して範囲指定してしまえば、そのフォームはJavascriptが有効でないと表示されないことになります。

ログインフォーム(サイドバー)への適用例:

<h2>Login</h2>
<%JSEncode(begin,Javascriptを有効にしてください)%>
<%loginform%>
<%JSEncode(end)%>

コメントフォーム(個別アイテムページ)なら:

<h2 class="comment">Add Comments</h2>
<noscript><p>Javascriptを有効にしてください</p></noscript>
<%JSEncode(begin)%>
<%commentform%>
<%JSEncode(end)%>
beginに続けて警告表示を書く場合はタグ記述が許されないので、このようにnoscriptタグで書いておくのも手。

メッセージ送信フォーム(メンバー詳細ページ)にもやっておくと吉。

数時間、様子を見て効果を確認しましたが、多くのスパムをシャットアウトできてるようでした。ただ「多くの」という限定がつくとおり、いくつかのスパムはこれを通過(1時間に1つ程度)。フォームをJavascriptで隠蔽しても、別のところでシステムがNucleusであると判断して決め打ちでスパム投稿するものがあるんでしょう。

NP_ProtectByMD5

スキンに始点・終点を記述することで、その範囲内のフォームに自動で特殊な値をもつ隠しフィールドを追加します。特殊な値のうち1つは、Javascriptによる演算によってセットされます。

コメントフォーム(個別アイテムページ)への適用例:

<h2 class="comment">Add Comments</h2>
<noscript><p>Javascriptを有効にしてください</p></noscript>
<%ProtectByMD5(begin)%>
<%commentform%>
<%ProtectByMD5(end)%>

Javascriptで隠しフィールドを自動的に追加してくれるのがこのプラグインの利点なのですが、追加フィールドの内容判定をどのタイミング(アクション)でするかをプラグインオプションで複数指定できるのもポイント。
デフォルトでは"addcomment"が指定されてますが、改行して"sendmessage"と追加すれば、メンバー詳細ページのメッセージ送信フォームにも適用できます(もちろんスキンでの範囲指定が必要です)。

アクションは、HTMLソースでフォームを調べればわかります。

<input type="hidden" name="action" value="(この部分です)" />

逆に言うと、この隠しフィールド"action"が無いフォームには適用できません。

こちらを通過できるスパム投稿はまだ来てないです。やはりただ隠蔽するよりプラスアルファの障壁を設けたほうが、決め打ちの投稿を排除できるのでより効果的。このプラグインが相当普及すれば対策取られて破られてしまう可能性はありますが、まあしばらくは安泰でしょうね。
実際にログを取って確認してみましたが、追加フィールドをまったく認識できてないか、ページを走査してるものの"'+MD5_hexhash("とか"' MD5_hexhash("を投げてくるスパムボットが多いです。なんでこんな値を投げてくるかは、HTMLソースを見てみればニヤリときます。

おまけ

今はコメントとメールフォームにNP_ProtectByMD5、ログインフォームにNP_JSEncodeを適用して様子を見てます。

同じ箇所にこの2つのプラグインを組み合わせて試そうとしましたが、残念ながらうまくいきませんでした。
もしかしたら、NP_ProtectByAjax(JSEncodeの隠蔽方式をAjaxによるものに置き換えたもの)とNP_ProtectByMD5の組み合わせならうまくいくかも。うちはシステムと各ブログがサブドメインで分かれてるのでAjax系は相性悪くて試してませんが、だれか良かったらチャレンジしてみてください。

ちょっとめんどくさいですが、「NP_NoRobotCommentをちょっと改造」の記事のような方法もあります。