Yuriko.Net 個別記事

2008-04-03
くもり

唸るほどスパムが来るので対策

ゆりこ による 13:21:44 の投稿
カテゴリー: WordPressハック
タグ:

当サイトを 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」です。

トラックバック・コメント »

  1. [...] ただ、Yuriko.Net » 唸るほどスパムが来るので対策の、 Akismet に頼ってもいいのですが、コメント ID [...]

  2. [...] Nonce,Please!さんを止めてみたらコメントが投稿できました 確かにWP標準搭載されているAkismetだけじゃ正直頼りなかったのでレビューで【良いぞ!】と書いてあった此方を併せて使用して [...]

  3. [...] wp_nonce_field を使うのがおすすめ by Yuriko.net [...]

  4. [...] コメントスパムを撃退してくれるプラグインを追加です。 以前Nonce,Please!さんを導入して [...]

上に戻る

※スパム対策プラグインの影響により、すぐにトラックバックが反映されない場合があります。お手数ですが、半日ほど待ってみてください。

コメント投稿

※発言の責任を明確にするため「名無し」「通りすがり」「匿名希望」等の匿名は不可とします。捨てハンドルでもいいので必ず名乗ってください。
XHTML (使えるタグ): <a href="" title="" ktai=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt=""> .
※スパム対策プラグインの影響により、すぐにコメント内容が表示されない場合があります。お手数ですが、半日ほど待ってみてください。

上に戻る