WordPress – コメントのSPAM対策をしてみる(WP Hashcash)

投稿日:2012年01月04日

image
図1:管理人の管理しているあるWordPressサイトのAkismetが処理したSPAM数

WordPress は、akismet というSPAM対策のプラグインをデフォルトでもっていて、このプラグインの活躍がだんだん増えてきました。
大半は自動でSPAM判定してくれるものの、判定しきれないものは WordPress に登録したアドレスにModerate のメールが飛んでくるので人間が判定しないといけません。また、ごくまれに akismet をすり抜けて書き込みをするbot らしきものも出てきました。
ただし、akismet の判定は優秀で、すりぬけたものは、人間でも「んー。これはどっちかな・・・。コメントの意味が通ってないからおそらく bot だろうな」みたいなものでした。

いづれにしても今後、アクセス数が伸びていくと対処できなくなってくるような不安も出てきました。

そこでコメントを書き込まれて、akismet に加えて bot にコメントを書き込ませないプラグイン WP Hashcach を導入してみました。
デフォルト設定では、WP Hashcach は、まず akismet にコメントを見させて、そのあと、WP Hachcach でチェックする。という風になっているようです。(私の理解が正しければ)

WP Hashcach は、相手がブラウザを開いているかどうかをチェックするので、ほぼ100%botを防げるようです。

WP Hashcash

WP Hashcash のダウンロードは、以下のページから zip をダウンロードして、puginフォルダーに放り込む方法もできますし、WordPress のプラグインの検索から “WP Hashcash” で検索して追加する事もできるます。(私は簡単な後者でやりました)

WP Hashcash Plugin for Spam by WordPress Plugins

image

機能

ホームページの Features を見てみると・・・

  • Blocks all comment spam, but not real comments  ( 実際のコメント以外のスパムコメントをすべて防ぎます)
  • Also prevents most trackback / pingback spam  ( 大半の トラックバック、pingバックスパムも防ぎます)
  • Also protects signup pages for WordPress (WP), BuddyPress (BP), and WordPress Multi-User (WPMU) (WorPress と BuddyPress 、WordPress マルチユーザーのサインアップ・ページを守ります。)
  • Widget support to display spam statistics and edit the configuration (スパム統計のウィジェットをサポートします)
  • Works with IE, Firefox, and Safari  ( IE 、Firefox 、Safari に対応しています)
  • 100% standards compliant XHTML 1.1, works with jQuery and Prototype  ( XHMTL 1.1 に対応していて jQuery と Prototype でも動作します)
  • Tested with Wordpres 2, Firefox, Safari, IE, and Chrome ( WordPress2 、Firefox、Safari, IE と Chrome でテストしました)
  • Akismet compatibility  ( Akismet と互換性があります)

一部、意味が取れないところもありますが、一応、メジャー・ブラウザでテストはされているようです。
「サインアップ・ページ」も保護してくれるというのは、おそらく勝手なユーザーを作るのを防いでくれるんでしょうね。。さすがにbotにログインIDを作成されたことはないのですが、これはよさそうです。

ちょっと気になるのは、スマートフォンの場合はどうなるのかな。。携帯からのコメントはブロックされるかもしれませんね・・・ここは要テストかな・・・

前提条件1

このプラグインには、以下のような制限事項があります。

WP Hashcash relies on the presence of two hooks in your theme, wp_head and comment_form. If your theme doesn’t include these actions, you will need to add them immediately before the </head> and </form> tags respectively.

また、wp_headcomment_form でとうアクションでフックしているので、テーマがこれに対応している必要があるそうです。通常は対応しているようですが、初心者には??という記述です。

ちょっと深入りしてこの記述を理解してみます。
ふむ。と思い、私のテーマで使われている header.php を探ったところ、以下の記述がありました。

<?php
/* We add some JavaScript to pages with the comment form
* to support sites with threaded comments (when in use).
*/
if ( is_singular() && get_option( ‘thread_comments’ ) )
wp_enqueue_script( ‘comment-reply’ );
/* Always have wp_head() just before the closing </head>
* tag of your theme, or you will break many plugins, which
* generally use this hook to add elements to <head> such
* as styles, scripts, and meta tags.
*/
wp_head();
?>

さらに、comments.php を探ってみると・・・

<p><input name=”submit” type=”submit” id=”submit” tabindex=”5″ value=”<?php _e(‘コメントの投稿’, ‘kubrick’); ?>” />
<?php comment_id_fields(); ?>
</p>
<?php do_action(‘comment_form’, $post->ID); ?>

</form>

wp_head の時とは記述が異なりますが、確かに comment_form という記述があります・・・

アクションって?フックって?と思ったので調べてみると、以下のページがわかりやすかったです。(とは言え、完全には理解していませんが・・・)

プラグイン API – WordPress Codex 日本語版

ようするに、プラグインはWordPress のテーマに仕込まれている wp_head や comment_form が呼び出されたタイミングで自分を呼び出すようにしていて、これらの”フック”と呼ばれる記述が無いとプラグイン自身が呼び出されないようです。
フックには、「アクション・フック」と、「フィルター・フック」があるようです。
「アクション・フック」と、「フィルター・フック」の違いは詳細は次に勉強するとして、プラグインは add_action(アクションフック用) / add_filter(フィルターフック用) という関数を使って、自分で定義した関数を WordPress の関数 ( たとえばここでは、wp_head  ) に結びつける事で、

wp_head( ) が呼び出される → プラグイン内で自分で定義した xx_xxxxx という関数が呼び出される。

という形でプラグインを動作させているようです。なので、この場合、 wp_head( ) がテーマ内に無いと、そもそもプラグインが呼び出されないんですね・・・
ふむふむ。そういう形でプラグインというのが作られてるんですね。。。一回、作ってみたいな。。。

ところで、comment_form は、wp_head と記述が違って、do_aciton という関数の中に入ってますが、do_action は、

<?php do_action( 作成したいフック名, フックに渡す引数 ); ?>

というように使われ、comment_form という引数を渡した場合、comment_form というアクションフックが作成されるようです。

関数リファレンス/do action – WordPress Codex 日本語版

プラグインを関連付けできる(”関連付け”という言い方は正しくないかも)、「アクション・フック」 と「フィルター・フック」の一覧もありました。こんなにあるんですね・・・
これだけあるのは、適切なタイミングでプラグインを呼び出すためなんでしょう。ですが、同時にテーマを自作するときには、これらの関数がすべて呼び出されるようにしていないと、特定のプラグインが動作しないテーマができあがるってことだろうなあ・・・ テーマづくりは大変そうです。(便利な方法があるのかな・・・)

前提条件2

通常 bot は、ブラウザーを開かないで HTTP リクエストのみで WordPress にアクセスします。
wget 等のコマンドを使ってテキストベースで、URLにアクセスして、データを取得したり、送り込んだりします。

「ブラウザーを開いてない」というのが boto と人間の大きな違いになるようです。
bot は通常、サーバー上に設定されてブラウザーをいちいち開く動作をしていたら、複数のbot を1台のサーバー上で動かすのは困難ですからね・・・なるほど・・・

ブラウザーを開いているかどうかは Javascript が使えるかどうかをチェックの代わりにしているようです。なので、以下の制限があるとHome Page に記述されています。

Javascript is required to submit a comment (コメントを投稿するには Javascript が必要です)

最近はJavaScript を OFF にしているユーザーは、ほとんどいないと思うので、おそらく影響はほとんどないかな・・・
Q&Aに以下の記述がありました。

How does it prevent comment spam? (どうやってコメントのSPAMを防いでいますか?)
By forcing clients submitting comments to additional compute a value from javascript and submit it along with the comment. (クライアントに Javascript で計算させた値を、コメントと一緒に submit(送信)させるようにしています。)

JavaScript を使えるbot が出てくればそれまでですが、そういう高機能bot はメモリもCPUも食べてブラウザーのようなbotになり、botの維持コストが高くなるのでかなり有効そうに思えます。
一応、ユーザーに注意を促すためにコメント欄に以下のような注意書きを付けました。

    <?php comment_id_fields(); ?>
</p>
<?php do_action(‘comment_form’, $post->ID); ?>

</form>
<p>※コメントの書き込みにはJavaScriptが有効になっている必要があります。</p>

プラグイン導入後の設定画面

以下がプラグイン導入後に出てくる WP Hashcah の設定画面です。
デフォルトでは、Moderation が「Akismet」になっています。多分、これだと Akismet に一度判定させてからそれをすり抜けたものが WP Hashcash に回ってくる。と解釈しています。

image

ここではAkismet 側にまかせないで、WP Hashcash にまかせてみるために以下のように「Delete」に設定しました。
おそらく Akismet 側で一回処理させた方がよいと思うのですが、テストのために、こうすれば Akismet の統計でどれだけ減ったか確認することができると思ったからです。(正しいかな・・・自身なし)

image

効果測定

実際、このプラグインがどのくらい効果があったかは、後日、思い出した頃にアップデートしたいと思います。