2008年4月03日の投稿

唸るほどスパムが来るので対策
当サイトを 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 の予定
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 対応は困難です)。

上に戻る