2007-01-29(月) [長年日記]
■ tDiary: Akismetスパムフィルタを書いてみた
2007-01-30修正: プラグインによる設定を追加したので、少し設定方法が変わった。
半年ほど前に、メールアドレスを入力してくるツッコミをすべてspam扱いするようにして以来、ほとんどのspamを排除できるようになった。が、今日はとうとう、名前欄にメールアドレスを入力するという技を使われてしまい、1通通り抜けられてしまった。
悔しい。
悔しいので、ついにAkismetに手を出すことにした。とりあえずフィルタ部分だけ書けたので、coreのtrunkにcommit済み。CVS最新版のtDiaryでないと動かないと思われ。あとで設定用のプラグインも書く。
ちなみに、↑は表向きの理由で、本当はToDo2.2に残ったタスクに、ちょっと食指がのびるネタがなかったからなんだが。つまり逃避。
Akismetスパムフィルタの使い方
(0) tDiaryを最新版にする
少なくとも、2007-01-30作成のスナップショットか、同レベルのCVS trunkにする。core、pluginとも。
(1) Akismet API keyを取得する
個人利用向けのフリーなAPIキーを取得する。といっても読めばわかるとおり、WordPress.comのアカウントを取得するのと同義である。tDiaryのフィルタを使うためにWordPressのアカウントを取るという矛盾を楽しみたまえ。
メールによるconfirmation後、profileの編集画面に「Your API Key」という12桁の文字列が表示される。というか、英語がよくわからん人はこのへんを参照。
(2) tDiary上で設定
プラグイン選択で「akismet.rb」を有効にすると、「セキュリティ」の中に「Akismet spamフィルタ」が追加されるので、設定画面を開く。(1)で取得したkeyを入力し、フィルタを有効にする。
なお、Akismetは日本語のコメントをspam扱いしがちという噂もあるので、spamフィルタの設定画面で「spamと判定されたツッコミを非表示にする」としておき、有無を言わさずに捨てられないようにしておいた方がいいと思う。
(3) あとはspamが来るのを待つ
おれのところにはまだ来てないので、本当に動いているのかどうか不明。よって効果も不明。そもそも他のフィルタですでに十分にフィルタリングできているから、いつになったら作動するのやら……。試しに、他のフィルタを切ってみようかしらん(←本末転倒)。
(おまけ)実装の話
なんだかくだけた感じのAPIリファレンスを見ながら実装。Ruby実装がすでにあることに気づいたのは出来てからだったが。
しかし、ドキュメントには一言も「REST」の文字がないものの、APIのエンドポイントにがっちり「rest」の文字が躍ってるってことは、WordPressの中の人も、これがRESTだと思ってるんだろうなぁ。もう、完全に誤った「REST」が定着してるね、全世界的に。
■ ドメイン名の長さでspam判定してみる(2)
spamつながりで、先日の細工の続き。
Apacheのログをじっくり眺めていたら、最近の「長いドメイン名のreferer spam」には、重大な特徴が。末尾にみんな「#」がくっついているのである。なにそれ。普通にブラウザ使ってたら、絶対にこんなrefererが発生するわけがない。こいつら、自分からbotだって主張してるわけか?
だったら、これで十分だよなぁ。
# badreferer.rb require 'uri' module TDiary::Filter class BadrefererFilter < Filter def referer_filter( referer ) return (referer !~ /#/ ) end end end