コメントspamフィルタ
少しいじって、本文中のURLだけじゃなく本文そのものにマッチさせるNGワードを設定できるようにした。それとIPアドレスでの制限もできるようにしてみたつもり(そんなのHTTPサーバレベルでやったほうが良いけど)。
前と同じ場所に置いた。
今日のコメントspam
また来たよ。どうも見た感じではほとんど全ページに対してspamを送り込もうとしてたみたい。今回は2005-07-09T20:58:53+0900から2005-07-09T22:57:20+0900の間に20ホストから1,086リクエスト。およそ6.5秒に一回。アクセスの多いほうの6ホストで674アクセスを占めている。User-AgentはすべてMozilla/4.76 [en] (Win98; U)だな。
この前ざっと集計してみた結果と比べてみたけど、やっぱり重なりはないみたい。どうしようもない。
コメントエディタプラグイン
先日のネタにからめてコメントの表示状態を一括変更できるプラグインを考えてみた。
@ioにアクセスする方法については今のところ考えなしなのでObjectSpaceを使ってしまった。そんなことよりも、あいかわらずtDiaryの構造を追っていないのでかなり危うい予感がする。だが、まあ、なんとなく動いてはいるようだ。
いきおいでいろいろ設定できるようにしてしまったけど、コマンドまわりは静的に設定するようにすべきだろうなあ。あるいは、それなりのアクセス制御を施せる環境向けとするか、かな。
どっちみち、多くの人に興味を持たれるというネタではなさそうという話もありそう。でも一応コードを置いとく。あまりテストできていないので実際に運用するのはやめたほうが良いと思う。あと、コマンド実行できるようにした場合、テストだとしても扱いに注意しないとセキュリティ上の問題に直結する可能性がある。
ツッコミspam対策にbsfilter
例の手入力かなとも思えるツッコミspamを見て、こうなってくるとパターンマッチでは追いつかないなあと思った。別の手段が何か必要かなという気分で考えてみると、やはり手軽なのはベイジアンフィルタを使うことだろう。
負荷の面で問題となる可能性はあるが、ベイジアンフィルタによる判定を行わせること自体は特に難しくはない。ではベイジアンフィルタを学習させるための指示をどのように与えるかについてはどうかというと、これは少し考えなくてはならないようだ。
一つのやり方としては、表示・非表示に切り換えに合わせて学習させるというのが考えられる。この方法は分かりやすいのだけど、tDiary 2.0.1の構造では、tDiary本体の修正なしに実現できるかどうかちょっとわからない。フックに頼らず、プラグインで無理矢理対処するという手もないではないが……。
他のやり方として、後で一括して学習処理を行わせるという方法が考えられる。ベイジアンフィルタも含めたフィルタ適用の結果をデフォルト値にして、管理画面から明示的に学習させるというようなイメージ。この場合は新しいツッコミを学習させたかどうかを管理する必要がある(おそらく最終学習日時を記録しておくなどが必要ではないか)。
他にもいろいろ考えられそうだが、シンプルなほうが良いなら後者のようなのよりは前者に近いほうが好ましいだろう。
まあ、それはそれとして、というか、その前に、ベイジアンフィルタが機能するかどうかは一応確認しておいたほうが良さそうだ。そこでこの日記での表示・非表示を基準にして一度やってみた。表示されているツッコミについては特に注意はいらないが、非表示にしているものの中には、重複したツッコミ、テストのためのツッコミ、何か事情があったものなども含まれているので、そのあたりがどう効いてくるかが気になるところ(もっとも、こういうのはサイトに依存した事情だろうけれど)。
現在の保存されているツッコミのうち表示が266個、非表示が4,337個で合わせて4,603個ある。実に94%が非表示で、そのうちのほとんどがspamなわけだ……。これらをメール風の形式に変換してbsfilterに一度だけ学習させ、同じデータに対してspam判定をさせたところ、spamだと誤認識したのは2/266で0.75%、spamでないと誤認識したのは25/4337で0.78%だった。前者の内容は「テスト。」というだけのテストツッコミ*1とMozillaの設定をうんぬんする内容でuser.jsの記述に終始しているものだった。後者のうちの二件は一つの単語をひたすら繰り返しているだけの多分いたずらで、他はテストツッコミだった。
もちろん、これまでに受けたことのない例のツッコミを食わせてみると誤判定をしちゃったわけで、全体的に、まあ、そりゃあそうだよなあという感じの結果でしかないわけだが。
*1 これは誤って表示にしていたものだったので非表示にしておいた。
またもコメントspam
前回と同様のパターン。同じツールを使っているのかな(ツールだかなんだかわからないけど)。今回は2005-06-26T01:23:01+0900から2005-06-26T03:22:34+09の間に375アクセスで17ホストから。
ここのところ(6/14〜6/26)にコメントspamを送ってきたホストのうちでフィルタにひっかかった中のアクセス数上位30を抜き出すとこんな感じ(IPアドレスでソート、強調はアクセス数上位5):
24.12.119.155 24.51.38.160 24.60.225.115 24.107.190.182 24.116.120.110 24.147.171.251 24.214.32.67 24.220.238.168 24.250.3.184 63.162.37.86 67.149.72.113 68.0.53.164 68.8.180.184 68.53.146.20 68.82.222.192 68.98.141.59 68.204.193.203 68.229.221.144 69.143.126.123 69.152.64.61 69.171.4.114 69.182.181.232 69.209.192.91 69.230.101.129 70.128.87.179 70.179.43.83 70.185.239.248 70.249.186.30 155.97.195.246 207.38.253.80
コメントspam再び
今日またコメントspamが来てた。前回、REQUEST_URIへのマッチ条件を広めにとっておいたのが今回は効いた模様。
今回は2005-06-24T21:24:20+0900から2005-06-24T23:13:30+0900までの間に640アクセスあったようだ(フィルタのログに残っていたもの)。アクセスしてきたIPアドレスは18個。
コメントspam対策
またもコメントspamが来襲。ちょうど対応できないタイミングだったのでさらしたままになってしまっていた。
今回くらったコメントspamは2534リクエストで、そのうち58リクエストがなぜかInternal Server Errorになっていた(自前フィルタがおかしいのかな?)。自前フィルタのデバッグログには1419リクエストを排除した記録が残っており、RSSを見たところでは39リクエストが通ってしまたようだ。残り1076リクエストはコメントの内容がまったく同じだったためにtDiaryのデフォルトのフィルタによって廃棄されたのだと思う。
最初のPOSTが2005-06-14T08:57:29+0900で最後のPOSTが2005-06-14T14:34:20+0900。だいたい5時間半の間に1回/8秒のペースでPOSTされていたことになる。POSTしてきたホストは全部で25。
今回の敗因の主要な一つはREQUEST_URIのチェック不足。すべてが/diary/./へのPOSTであったのだが、自前フィルタでは/./との比較しかしていなかった。これについてはもう少しマッチの範囲を広げておいた。あと、NGワードを少しだけ足して、その他のパラメータも少し厳しくしておいた。
これでいつまでもつかな。


