2008年4月03日の投稿

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

Ktai Style 1.3.0 の予定

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

WordPress ME サポートエイプリルフールで時間が取られていましたが、Ktai Style も少しずつ改良しています。来週ぐらいにリリースしようと思っています。主な機能アップは以下の予定です。→リリースしました

  • WordPress 2.0.x にも対応 (閲覧のみで、管理機能は使用不可)
  • 携帯対応のブログサービスへのリンクは、中継ページを出さずに直接ジャンプ
  • 外部サイトのリンクで、a 要素に class=”ktai” を追加した場合、中継ページを出さずに直接ジャンプ
  • コメント時に端末識別情報必須の場合、iモード ID を取得 (端末 ID 取得と違ってダイアログが出なくなる)
  • 自作の携帯テーマファイルは wp-content/ktai-themes/ ディレクトリー配下に入れるようにした (従来の場所も認識します)。
  • 自作テーマで、独自の menu_XXX.php ファイルを作った場合、?menu=XXX で呼び出せる。例えば、menu_events.php で「直近のイベント」というページを作るという技がある。
  • 携帯キャリアのIPアドレス帯域からアクセスしているかの判別に対応

どちらかというと地味な機能アップです。WordPress 2.0 対応ですが、閲覧だけならばさほど修正しなくても使えることが判明したので、管理機能は無効として対応することにしました。せっかく ME 2.0.x サポートをすることにしたので、こちらのユーザーさんにも使ってもらいたいですから。でも、PHP5 が必須ですよ ;-) (PHP4 対応は困難です)。