Yuriko.Net 個別記事

唸るほどスパムが来るので対策
当サイトを WordPress 2.5 にして数日立ちますが、強烈な数のコメントスパムが到来するようになりました!! Akismet を有効にしていたため、表には見えていませんが、1日で200件程度来ます。ドメイン名直下に WordPress があるのは攻撃されやすいのかも (旅行記はあまり来ない)。
Akismet に頼ってもいいのですが、コメント ID がインフレするのは少し癪です。そこで、明らかに不正だと思うコメントを排除すべく対策を打ちました。
その1: コメント受け付けスクリプトの移動
WordPress はコメント受け付けスクリプトが “wp-comments-post.php” というファイル名で決め打ちです。したがって、スパマーは、このファイルをターゲットにいきなり POST メソッドでアクセスすればいいわけです。
そこで、スクリプトのファイル名を変更し、それに合わせてテーマの comment.php にある action 属性 (コメント送信先) を変更しました。さらに、.htaccess で wp-comments-post.php へのアクセスを 403 Forbidden にしました。ちょっとは効果がありましたが、すぐにスパムが来るようになりました……。
その2: リンクを拒否
スパムコメントのほとんどは、2つ以上のリンクがあります。HTML で a 要素を使っている場合と bbcode で [url=...] 記載をしている場合の2種類あります。そこで、wp-comments-post-XXX.php (リネーム後のコメント受け付けスクリプト) にて、そういう場合にエラーを出すようにしました。マルチバイト文字があると予想される場合は、日本語でエラーをインライン表示 (スクリプト末尾の catch 節に飛ばす)、そうでない場合は wp_die によるエラー表示としています。
if (preg_match('/\[url[=\]]https?:/', $comment_content) || preg_match_all('|https?://|', $comment_content, $links) >= 2) {
if (preg_match('/[\x80-\xff]/', $comment_content)) {
throw new Exception('エラー: コメントに不正なリンクがあります。');
} else {
wp_die('Error: Bad links in content.');
exit;
}
}
その3: 念のため wp_nonce も入れる
上記対策で十分と思われますが、念のため wp_nonce によるチェックを入れて、コメントフォームからの投稿以外を弾くようにしました。まず、テーマの comment.php で以下のコードを入れます。
<?php wp_nonce_field('post-comments_' . $id); ?>
次に、wp-comments-post-XXX.php で nonce をチェックします。先頭近く、$comment_post_ID を取得した直後がいいでしょう。
if (! isset($_POST['_wpnonce']) || ! wp_verify_nonce($_POST['_wpnonce'], 'post-comments_' . $comment_post_ID)) {
wp_die('Error: Please back to comment form, and retry submit.');
exit;
}
ここまでやれば、wp-comments-post.php 直接攻撃は避けられるでしょう。あとは、日本語文字列を含まない場合を拒否するコード (懐しの SOMY SpamBlock JP みたいなもの) を入れるかどうかです。
[追記] 「その3」をプラグイン化したものが「Nonce! Please」です。

上に戻る
[...] ただ、Yuriko.Net » 唸るほどスパムが来るので対策の、 Akismet に頼ってもいいのですが、コメント ID [...]
[...] Nonce,Please!さんを止めてみたらコメントが投稿できました 確かにWP標準搭載されているAkismetだけじゃ正直頼りなかったのでレビューで【良いぞ!】と書いてあった此方を併せて使用して [...]
[...] wp_nonce_field を使うのがおすすめ by Yuriko.net [...]