スパムタグの投稿
2008-07-28
ウェブサイト/ウェブログのオーナーさんで、わたしのコメントを頂いた方はご存知と思いますが、メールアドレス必須設定の場合「yuriko-wp-ドメイン名 (あっと) ゆりこねっと」という形式のアドレスを使っています。コメント投稿先が http://www.example.com/ の場合、「yuriko-wp-example.com @ ….」とするわけです。
これは qmail の拡張メールアドレスを使って生成したもので、きちんとメールが届く正当なアドレスなのですが、初めて見る方にはちょっと不思議、ないし不審なものかもしれません。そこで、「問い合わせ」ページに説明を入れて、今後書くコメントは、ウェブ URL の欄にこの問い合わせページのアドレスを書いてみることにします。これで、「何か変なアドレスやなーー」と思った人でも理解しやすくなるかと思います。
同様のテクニックは Gmail のアドレスでも可能です。しかし、Gmail の場合は、そもそもスパムが届かないので、策を講じなくてもいい気がしますね……。
2008-07-07
WordPress プラグインコンペ用に作っていたプラグインを公開します。名称は「Nonce! Please」をそのまま採用し、説明を「スパム軽減プラグイン」としました。コンペの趣旨に乗っ取り、説明ページを英文の固定ページで作っています。
動作は、コメント/トラックバック受け付け URL に nonce (ランダム文字列) を必須とする、ものです。nonce は12時間ごとに変化するため、スパマーがトラックバック URL を蒐集しても、送信時には無効になっていることが期待されます。コメントも、コメントフォームを使わずに直接 wp-comments-post.php に送信してくるようなものは拒否されるわけです。
リリースに時間がかかったのは単にドキュメントが書けてなかっただけです。今回、えいやっで英作文しまして、とりあえず形にしました。めちゃめちゃ稚拙な英文で恥しいですが、non-native が書く技術文書であれば、うまい/へたはあまり関係ないでしょうし……。
あとは、固定ページの体裁をもうちょっと整えて、コンペに参加するだけですね〰。実はもう1本ネタがあるので、これもさっさとでっち上げる予定です。
[追記 22:05] 固定ページは作ってあったものの「非公開」のままでした……。さきほど公開しました。せっかくなので、ダウンロードリンクをこの記事に入れておきます。
2008-06-09
WordPress プラグインコンペティション用にコメントスパム対策プラグインを作っていますが、当サイトで稼動させてみることにしました。実は旅行記の方で動かしていましたが、そちらはトラックバックがめったに来ないので運用テストにならないのです
すでに発表している「短かいコメントを拒否するプラグイン Reject Short Comments」とは違う発想のプラグインで、コメントやトラックバック用 URL に _wpnonce引数を付けるという仕組みです。WordPress はコメントやトラックバック受け付け URL が決め打ちのため、スパマーにとっては元記事を見ずにいきなりスパムを送り付けることが可能です。これを防ぐため、トラックバックURLをランダム化したり、コメントフォームの隠しフィールドとして _wpnonce を入れるという対策を行うものです。名前は安直に「nonce, please!」とする予定です。
この対策は万全なものでなく、あくまで「Akismet をできるだけ起動しなくてすむ」ようにするためものです。このため、Akismet 等、他のプラグインと併用が推奨です。正直なところ、このプラグインの実装は WordPress コアに取り込まれてもおかしくないと思っているぐらいです
まだドキュメントが書けていないので公開はできませんが、近日中にドキュメントを書いて公開する予定です。コンペの規約で、プラグインの紹介は投稿ではなく固定ページで行うこと、となっているので、当サイトで固定ページを増やす方向で検討したいと思います。他のプラグインの紹介も固定ページを作った方がいいのかな??
この手法の問題点は、キャッシュプラグインと相性が悪いということです。_wpnonce の値は半日ごとに変化するため、キャッシュが半日以上有効な場合、すでに無効となった _wpnonce を含むトラックバック URI が表示される可能性があります。したがって、キャッシュプラグインを使う場合は、キャッシュの有効期限を半日未満にしないといけないです。1/4 日 (6時間) 未満というのが安全でしょうか。
[追記] リリースしました。
2008-05-25
まことに申し訳ないことに、5月20日ごろから当サイトおよび旅行記でコメントができない状態になっていました。スパム対策のため、「コメント欄に URL しか入ってない」状態のときエラーを出すようにしたのですが、デバッグのため、正しいコメントでも exit() させていたのを除去し忘れていたのでした。携帯電話は、コメント受付処理が違うためコメント可能だったはずです。
トラックバック・ピンバックが可能だっため、気がつくのが遅れてしまいました。コメントしようとしていた方にはご不便をおかけしておりました。ごめんなさい。
なお、Reject Short Comments にもバグがあって、コメントできない状態になっていた模様です。配布ファイルを差し替えておきました。なんと、テスト方法がミスっていて、配布したファイルはテストが通っていなかった (!) のが原因でした。当サイトだけ特別に wp-comments-post.php をいじっていますが、そこで Reject Short Comments と同じ処理を入れていたため、正しく動いていると勘違いしていたためでした。
2008-05-21
以前公開した、「内容が短いトラバを拒否するプラグイン」ですが、コメントスパムにも対応させました。名前も「Reject short comments」に変更しています。
- トラックバックの拒否バイト数は 128 バイトに増やすかわり、0×80-0xfc が含まれる場合 (==マルチバイト文字列と推測される場合) は短い場合でも救済することにしました。
- コメントスパムはマルチバイト文字列であっても 64 バイト未満を拒否します。64バイト以上であっても、全体がハイパーリンクである場合は拒否します。
Akismet と違って、拒否したコメント等は記録に残りません。スパムをデータベースにすら記録させないことが目的なので、誤爆に対しては厳しい対応となっています
とはいえ、まともなトラックバックならば、ある程度の長さがあると思われるので大丈夫でしょう。
[追記 2008-05-25] なんと、コメントが一切できないというバグがあったので、アーカイブを差し替えました。ご迷惑をおかけしました。あと「http:// のリンクが2つ以上あるとエラー」にする仕様になってて凶悪すぎるのでそれもやめました。
2008-05-01
以前公開した、「内容が短いトラバを拒否するプラグイン」ですが、細かい問題点が見付かりましたので、修正版を公開いたします。
- Akismet をインストールしていると、Akismet によるスパムチェックが先に行なわれてしまう。
- [追記] にある Akismet 対策修正を行うと、Akismet を入れていない場合、コメントを投稿しても「重複するコメントが見付かりました」となって投稿できない。
- 拒否する文字数を48文字に変更。
「旅行記」の方は、もろ2番目の問題にひっかかっていました。どうりでコメントが来ないわけだ……。なお、今回は Telmina 氏による「日本語文字列を含む場合は許容する」パッチは当てていません。必要な方は適宜追加してください。
2008-04-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 みたいなもの) を入れるかどうかです。
2008-04-02
テクノラティで「H11T」で検索していると、ワードサラダとなっているウェブログが見つかりました。今までは、この手の「スパムブログ」は無視していたのですが、GIGAZINE によると「こまめに通報して削除させた方がよい」とのことなので、通報してみました。今回の対象はSeesaa ブログですが、通報窓口が少し分かりにくかったものの、丁寧な返事とともにすぐ対応されました。なかなかのものですね。
できるだけ、同じサービスで提供しているスパムブログをまとめて通報したいため、見つけたら手元に URL をメモしておいて、1週間ぐらいごとに通報するのがよいでしょうか。
2008-03-27

実は数日前、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] 修正版をリリースしました。上記のコードは使わないでください。