tDiary の各種スパム対策
tDiary の stable なバージョンは,デフォルトではスパムにはけっこう弱い.特に makerss.rb で RSS を配信している場合,コメントスパムが RSS に乗ってしまうので,読者の側もけっこう大変である (知人のサイトがつい最近まで,スパムに埋もれて本文が読めない状態になっていた.ちなみにうちは RSS にコメントを含めていないので,その心配はないはず).
しかし,contrib で配布されているツールや,個人が公開しているツールを使うことで,スパムを極力抑えることは十分に可能である.実際,自分のサイトに最近来るスパムは,最盛期に比べると 95% 以上カットできているように思う.
今回はうちで施している対策についてまとめておく.
コメントスパム
コメントスパム用のフィルタは各種あるが,いろんなフィルタを導入している場合,相性問題というのがある.うちの場合,[2006-02-11] にも書いた通り,antispam.rb を /tdiary/filter/ に仕込むことで一定の成果を見ている.うちではさらに以下のような改良を施して使用している.まず,デフォルトの「本文にURLを3つ以上含むツッコミを記録しない」を「6 つ以上」に緩和している.ツッコミに URL が 3,4 個入るケースはそこそこあるからだ.さらに,実はデフォルトのままでは「URL を 3 つ以上含むトラックバックも記録しない」という予期せぬ弊害が出てしまっている (なぜトラックバックまで巻き込まれてるのかまでは調べてないが,実験してみたら確かに URL を 3 つ以上含むトラックバックがはじかれてしまった.多分「tDiaryのTrackBackはツッコミ機能を利用して実現されてる」ことに起因するんじゃないかな).
そこで,トラックバックの場合 (ハンドル名が「TrackBack」なツッコミとして扱われる) は URL 数判定をしないことにした.具体的には,
elsif comment.body.scan( %r|https?://| ).size > 2 false
を
elsif comment.body.scan( %r|https?://| ).size > 5 if comment.name !~ /TrackBack/ false end
と変更した.
また,他にも comment.body の NG ワードとして "href=" だけでなく数十個 (insurance とか viagra とかそういうの) を "|" で区切って指定することで,けっこうはじくことができている.slot とかわりと一般的な語も含んでしまってるので,ホワイトなツッコミをはじく可能性もあるけど,まあしょうがないと思っている.ツッコミされる方はご注意下さい.
このフィルタでだいたい 9 割くらいを拒否できてる感じ.原理上,すり抜けてくるツッコミはけっこうあるが,まあ許容範囲だと思う.
来てしまったスパムに対しては,とりあえず当面は [2006-05-22] で教えてもらったように非表示で対処しているが,ある程度溜ったら tdiary-comment-clean スクリプトで一括削除する.
トラックバックスパム
[2006-10-15] でも書いた通り,linkcheck.rb を /tdiary/filter/ に導入して,言及リンクなしのトラックバックは全てはじいている.なお,来てしまったトラックバックスパムの削除も,上記の tdiary-comment-clean で一括して行える.リファラスパム
tDiary の「本日のリンク元」に表示されるリファラを悪用するタイプ.うちの場合,今月に入って突如数千件に急増した.ちなみに 11 月中旬頃にいったん今月のリファラ情報が全部消えたんだけど,何があったんだろう.スパムが多すぎたせいだろうか.リファラスパムについては,Anti Referer Spam プラグイン antirefspam.rb を /tdiary/filter/ に導入して一掃している.これは「リファラが示すURLに、自分の日記へのリンクが本当に含まれているかどうかをチェックする事で、リファラスパムを表示しないようにするプログラム」である.これでほぼ 100% リファラスパムを撃退できている.URL を見に行くのでそれなりの負荷はあるが,結果はキャッシュされるので毎回見に行くわけではない.なお,mixi など,ログインに認証が必要なサイトの場合はそのままではクロ判定されてしまうので,例外指定をする必要がある.他にもコメントスパム対策のオプション (「ひらがな・カタカナのないコメントは拒否」等) があるが,とりあえず antispam.rb で間に合っているのでうちでは使ってない.
既に記録されてしまったリファラの削除には,最初リファラエディタプラグイン refedit2.rb を試してみた.しかし,結論からいうと,うちではうまく動かなかった.導入後,設定ページで
undefined method `call' for "referer":String (NoMethodError)
というエラーが出た.ちょっとぐぐって,このあたりを参考にフィルタを書き換えたところ,エラーは出なくなった.しかし…なぜか「この日付のリファラを編集」ボタンが効かない.効かないというか,入力した日付の 24 日前に日付が飛んでしまうのだ.なんだこれはー.ソースコードを眺めるに,リファラが見つからない場合に最大 24 回捜索するあたりが誤動作している気がする.しかし Ruby はよくわからないのでとりあえず利用を断念した.
代わりに使ったのが,tdiary-referer-clean スクリプト.XREA 鯖に ssh でログインして使用する.ここ 3 ヵ月のエントリに来たリファラスパムを元に,特徴的な単語を含むリファラを削除した.もっと前のエントリにまだ多少残っているかも知れないが,99% は削除できたと思う.
まとめると,うちのポリシーとしては
- 特定の単語を含むコメント,特定ドメインのメールアドレスによるコメント,URL を 5 個以上含むコメントは受け付けない
- うちへの言及リンクのないトラックバックは受け付けない
- うちへのリンクのないリファラは (mixi 等一部を除き) 記録しない
最後に,同様の他のフィルタ類を紹介しておく.今のところうちでは使ってない.
- 10antispam.rb: コメントスパム,トラックバックスパム用フィルタ.tDiary 開発版 (2.1 系) で標準採用.
- comment_key.rb: 日付毎に一意なキーを付加することで,コメントフォーム以外の手段から書き込まれたコメントスパムを受け付けないフィルタ.
- tdiary-recent-comment-clean: 「最近のコメント」からスパムを削除するツール.うちではなぜかうまく動かなかった.
- チェックボックスパッチ: コメント投稿の際にチェックボックスをオンにしないと書き込めないというもの.
- spam.rb: ブラックな IP アドレスリストを利用してスパムをフィルタリングするもの.
- size.rb: ツッコミのサイズを制限するフィルタ.