2008-03-07 (金)
■ ツッコミSPAMくらった
RSSリーダーで購読されているかた、すみません。
応急処置
まずは被害拡大を防ぐのが第一。
- SPAMを非表示にする: 設定画面で「ツッコミの表示」を非表示に設定。ツッコミをまとめて消すまでの処置。
- 新しいSPAMを防ぐ: 1日あたりのツッコミ最大数を最大0件に設定。これで新規ツッコミはできなくなる。
本当は生成されたRSS(index.rdf)も削除したいんだけど、Webからは消せないみたい。
原因の特定
次に現在の状況を把握する。
- tDiary は最近 2.2.1 へバージョンアップした。
- 130日以上前の日付けのツッコミはjavascriptで表示するようにしていた。Sleipnirのセキュアモードでフォームが表示されないことを確認。
- メールアドレス欄は非表示にしている。Sleipnirでスタイルシートを無効にするとメールアドレス欄が表示される。
- 130日以上前の日記へもSPAMが来ている。
- SPAM にはメールアドレスが含まれている。
ここで原因を特定。tDiaryを2.2.0から2.2.1へアップデートした時に、フィルタをコピーするのを忘れている… orz なので、メアドが入力されたツッコミをSPAMと判定していなかった模様。
分かったこと←いまここ
JavaScriptを解釈するSPAMは存在する← 勘違いでした。フォーム経由じゃなくてダイレクトでPOSTしているみたい
対策(回復)← いまここ
- ツッコミSPAMを削除する
- コピーが漏れていた「メアドが含まれていたらSPAMとみなすよ」フィルタを追加する → フィルタじゃなくてWebから設定できた
- RSS (index.rdf) を再生成する
ここ2日に更新されたツッコミファイルから特定の文字列を削除するコマンド。 でも、その月のコメントがすべて対象になるのでちょっと面倒。 コメントと日付の両方で選択できるといいんだけど。
find . -name '*tdc' -ctime -2 | xargs ./tdiary-comment-clean 'free' > delete.txt
対策(予防)
- 今後のアップデートでもフィルタのコピーが漏れる可能性あり → あとで考える。フィルタ選択プラグインが使えるかも?
- JavaScript のエラーが発生しているので調べる
対策案
- JavaScriptでツッコミフォームを表示するときに、すぐに表示するのではなく一定時間待ってから表示するのはどうだろ?
■ tDiary のツッコミ SPAM を期間指定で削除する
tDiary にはツッコミ SPAM を一括削除するための tdiary-comment-clean というスクリプトが付属している。 このスクリプトは、正規表現とツッコミファイル (*.tdc) を引数として指定し、ツッコミ本文が正規表現にマッチしたらツッコミを削除するというもの。
でも、最近だと特定の期間に大量のツッコミ SPAM がくることが多い。 ちゃんとSPAM対策をしていれば、フィルタから漏れたツッコミだけを削除すればいい。 なので、スクリプトを修正して、削除対象とするツッコミの投稿日時を指定できるようにした。 使い方はこんな感じ。
tdiary-comment-clean2 -a 48 -b 24 free 2008/200803.tdc
-a は after hour で -b は before hour 。この例だと 200803.tdc に含まれる 48時間前から24時間前までの間に投稿されたツッコミを対象として、 free という単語が含まれるツッコミを削除する。 パターンの指定などは、従来の tdiary-comment-clean と同じ。
うちの日記の場合は、48時間前から24時間前に投稿されたツッコミをぜんぶ削除した。コマンドは以下の通り。
find . -name '*tdc' -ctime -2 | xargs ./tdiary-comment-clean2 -a 48 -b 24 . > delete.txt
- find コマンドを使って、2日以内に更新されたツッコミファイル (*.tdc) を抽出する。
- xargs コマンドを使って、それぞれのツッコミファイルに対して48時間から24時間以内に投稿されたツッコミをすべて削除する(削除パターンにドットを指定)
- delete.txt を確認して、 SPAM 以外のツッコミを削除していないかどうかチェック
ついでに試験用の「-t」オプションもつけた。 -t を指定すると、ツッコミファイルを削除しないようになる。 削除対処となったツッコミは標準出力に出力されるので、事前に -t コマンドで確認してから、実行することができる。 もちろん、どのスクリプトを使うにしても、事前にファイルはバックアップしておいた方がいいけどね。
スクリプトは CodeRepos にコミットしたよ。
うーん、こんなにも早く破られてしまいましたか…。
>JavaScriptを解釈するSPAMは存在する<br><br>本当? アクセスログを見て、POSTの前にGETがあるかどうか確認しましたか?<br>GETなしでいきなりPOSTする、「過去の実績を記憶しているbot」の存在は認識してます。
すみません。勘違いでした。<br>ログを確認したところ、GETせずにPOSTしてますね。<br>リファラが空なので、「ツッコミ先の日記からのリファラがなければSPAMとみなす」のもアリかもしれません。
2ch方式ですね >リファラ確認<br>まぁ、それはアリかなー。ツッコミできなくなっちゃう環境はなきにしもあらずだけど……。
〉〉GETなしでいきなりPOSTする、「過去の実績を記憶しているbot」の存在は認識してます。<br>〉リファラが空なので、「ツッコミ先の日記からのリファラがなければSPAMとみなす」のもアリかもしれません。<br>いきなりPOSTする際に、「過去の実績」からリファラを付与することは可能ですが、当面の間は大丈夫かもしれませんね。
>たださん<br>(1) JavaScriptでツッコミフォームを表示<br>(2) ツッコミフォーム経由のツッコミを許可<br>これってCSRF対策と同じ考え方(リファラかセッションキー)でいいような気がしてきました。<br>update.cgiで使っているキーはそのまま使えないですが。
あ、やっぱりCSRF対策とは条件が違うな。<br><br>>ockeghemさん<br>確かにリファラ付きでPOSTされるとアウトですね。<br>Cookieでセッション管理したほうがよさそうです。
対策版ができたらぜひ使わせてくださいww