コメントspamフィルタを更新

投稿者 akira 2005-07-14 15:01:00 GMT

URI用のNGワードをメールアドレスのチェックにも使えるようにしてみた。

あと、設定まわりを少し見直して整理した、つもりなのだけど、もしかするとエンバグしてるかも。

今日のコメントspam

投稿者 akira 2005-07-10 15:00:00 GMT

またまたやってきていた。2005-07-11T03:18:36+0900から2005-07-11T01:58:17+0900の間に750回のPOST。およそ6.4秒に一回のペース。9ホストから。

結局、HTTPサーバレベルで受け付けないようにしてしまっていたので、フィルタの出場はなく。

コメントspamフィルタ

投稿者 akira 2005-07-09 15:00:00 GMT

少しいじって、本文中のURLだけじゃなく本文そのものにマッチさせるNGワードを設定できるようにした。それとIPアドレスでの制限もできるようにしてみたつもり(そんなのHTTPサーバレベルでやったほうが良いけど)。

前と同じ場所に置いた。

今日のコメントspam

投稿者 akira 2005-07-08 15:01:00 GMT

また来たよ。どうも見た感じではほとんど全ページに対して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)だな。

この前ざっと集計してみた結果と比べてみたけど、やっぱり重なりはないみたい。どうしようもない。

コメントエディタプラグイン

投稿者 akira 2005-07-08 15:00:00 GMT

コメント編集画面のスクリーンショット(長いので途中略)先日のネタにからめてコメントの表示状態を一括変更できるプラグインを考えてみた。

@ioにアクセスする方法については今のところ考えなしなのでObjectSpaceを使ってしまった。そんなことよりも、あいかわらずtDiaryの構造を追っていないのでかなり危うい予感がする。だが、まあ、なんとなく動いてはいるようだ。

いきおいでいろいろ設定できるようにしてしまったけど、コマンドまわりは静的に設定するようにすべきだろうなあ。あるいは、それなりのアクセス制御を施せる環境向けとするか、かな。

どっちみち、多くの人に興味を持たれるというネタではなさそうという話もありそう。でも一応コードを置いとく。あまりテストできていないので実際に運用するのはやめたほうが良いと思う。あと、コマンド実行できるようにした場合、テストだとしても扱いに注意しないとセキュリティ上の問題に直結する可能性がある。

ツッコミspam対策にbsfilter

投稿者 akira 2005-07-07 15:00:00 GMT

例の手入力かなとも思えるツッコミ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 これは誤って表示にしていたものだったので非表示にしておいた。

プラグインからデータにアクセスするには

投稿者 akira 2005-07-07 15:01:00 GMT

管理画面でツッコミの一括操作というのを考えていたのだけど、conf_procからデータにアクセスすることができないっぽい? ObjectSpaceで無理矢理見付け出すっていう手があるにはあるけど、それもなあ。他に何か手はないものか。

またもコメントspam

投稿者 akira 2005-06-25 15:00:00 GMT

前回と同様のパターン。同じツールを使っているのかな(ツールだかなんだかわからないけど)。今回は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再び

投稿者 akira 2005-06-23 15:00:00 GMT

今日またコメントspamが来てた。前回、REQUEST_URIへのマッチ条件を広めにとっておいたのが今回は効いた模様。

今回は2005-06-24T21:24:20+0900から2005-06-24T23:13:30+0900までの間に640アクセスあったようだ(フィルタのログに残っていたもの)。アクセスしてきたIPアドレスは18個。

コメントspam対策

投稿者 akira 2005-06-16 15:00:00 GMT

またもコメント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ワードを少しだけ足して、その他のパラメータも少し厳しくしておいた。

これでいつまでもつかな。