スパムタグの投稿

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」です。

2008-04-02
晴れ

ワードサラダを通報する

ゆりこ による 15:17:37 の投稿
カテゴリー: ネットワーク
タグ: ,

テクノラティで「H11T」で検索していると、ワードサラダとなっているウェブログが見つかりました。今までは、この手の「スパムブログ」は無視していたのですが、GIGAZINE によると「こまめに通報して削除させた方がよい」とのことなので、通報してみました。今回の対象はSeesaa ブログですが、通報窓口が少し分かりにくかったものの、丁寧な返事とともにすぐ対応されました。なかなかのものですね。

できるだけ、同じサービスで提供しているスパムブログをまとめて通報したいため、見つけたら手元に URL をメモしておいて、1週間ぐらいごとに通報するのがよいでしょうか。

2008-03-27
晴れ

内容が短いトラバを拒否するプラグイン

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

実は数日前、Yuriko.Net 旅行記 の WordPress インストールディレクトリーを /travel/ に戻しました。以前、/travel/ → /wordpress/ に変更したのですが、そうすると、スパムトラックバックが激減するというメリットがありました。しかし、WordPress コアやプラグインで、インストールディレクトリー (/wordpress/) と、ウェブログ URL (/travel/) が違う場合を考慮してない場合があって、そういうときは動作がおかしくなります。

また、テクノラティーは「http://www.yuriko.net/travel」という URL を探そうとしますが、サーバーが「http://www.yuriko.net/travel/」へのリダイレクトを返答しても、うまく認識していない (リファラーなどがうまくカウントされない) という問題もありました。

で、インストール先を /travel/ に戻すと、さっそくトラックバックスパムが多数来ました……。WordPress は、ウェブログの URL からトラックバック URL を簡単に推測できてしまうので、こういう問題が起きます。←間違い。wp-trackback.php を直叩きしてました (なので、インストール URL とウェブログ URL が同じ場合に攻撃されやすい)。

しかし、スパムの多くは概要 (excerpt) がめちゃめちゃ短い (ランダムな10数文字) ので、そういう場合を拒否するプラグインを作ってみました。これで退治できればいいな〜〜。ソースにある通り、ライセンスは GPL としますので、てけとうに使ってみてくらはい。

[追記] 以後3本の記事にも共通ですが、プラグインとして使うためには、新規テキストファイルを作成し、以下のコードをコピー&ペーストして、UTF-8 コード (BOM なし) で保存します。ファイル名は英数字なら何でも構いません。そして、wp-content/plugins/ にアップロードして、管理パネルで有効化すれば OK です。有効化時に Fatal Error になるときは、コピー&ペーストに失敗しています。どこかに不正な文字が入っていないか、ファイル先頭や末尾に余計な改行がないか、確認してください。

<?php /*
Plugin Name: Reject short trackbacks
Plugin URI: http://www.yuriko.net/arc/2008/03/27c
Description: Rejects short trackbacks to keep away from spams.
Author: IKEDA Yuriko
Version: 0.70
Author URI: http://www.yuriko.net/cat/wordpress
*/

/*  Copyright (c) 2008 yuriko

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; version 2 of the License.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

define ('TRACKBACK_EXCERPT_LENGTH', 32);

function reject_short_tb($commentdata) {
	if ($commentdata['comment_type'] != 'trackback') {
		return $commentdata;
	}
	$excerpt = preg_replace('|^<strong>.*?</strong>\s*|', '', $commentdata['comment_content']);
	if (strlen($excerpt) < TRACKBACK_EXCERPT_LENGTH) {
		trackback_response(1, 'We cannot accept your trackback.');
		exit;
	}
	return $commentdata;
}
add_filter('preprocess_comment', 'reject_short_tb'); ?>

[追記 2008-04-21] Akismet と併用すると、先に Akismet がスパムトラックバックを補足してしまい、本プラグインが効かないことが判明しました。末尾の add_filter部分を以下のように変更して、無理矢理 Akismet の優先順位を下げれば OK です。

add_filter('preprocess_comment', 'reject_short_tb', 1);
remove_action('preprocess_comment', 'akismet_auto_check_comment', 1);
add_action('preprocess_comment', 'akismet_auto_check_comment', 2);

[追記 2008-05-01] 修正版をリリースしました。上記のコードは使わないでください。