« 2007年8月 | メイン | 2008年1月 »

2007年12月 1日

apacheでコメント・TBスパム対策

カテゴリー: [blog] [プログラミング]

blogの更新をさぼっていても、スパムは休んではくれないようです…

迷惑コメント・トラックバックがMovable Typeのデータベースに大量にたまっていきます。
(フィルタされたものは分類され未公開にはなりますが、DBにいったん入ります)
フィルタされてればいい方で、フィルタを通過して公開されてしまうものもかなり多いわけです。
アクセスのけっこうな割合がスパムなのは確実で、United Statesがアクセス数トップです。

Movable Type の SpamLookup プラグインでDNSBLをつかってフィルタ出来るんですが、もうブラックリスト入っていたら、Movable Typeに渡す前にフィルタしたくなってきました。
そうするとDBに入らないので、万が一誤検出した場合に回復する手段がないわけですが、どうせコメントはほとんどないし、とりあえず問題ないでしょう。

DNSBLを参照して、その結果を元にapacheに403を返させる方法がないかと調べてみたら、やっぱりそういうモジュールを作っている人がいるんですよね。

mod_setenvdnsbl : Apache module (nesitive thinking)|

早速インストールして、設定してみました。
インストールは、Makefileの先頭のAPXSのところを環境に合わせて書き換えて、make && make install するだけです。

設定はこんな感じです。

<Directory ...>
      <FilesMatch "mt-(tb|comments)\.cgi">
          SetEnvIfDNSBL remote_addr zen.spamhaus.org spammer
          SetEnvIfDNSBL remote_addr bsb.spamlookup.net spammer
      </FilesMatch>
      ...
      Order allow,deny
      Allow from all
      Deny from env=spammer
</Directory>

しかし、apacheでMT/WPのスパム対策 DNSBLのmod_setenvifdnsblを使ってみる (blog@browncat.org) でも指摘されているように、複数のDNSBLを指定すると、最初のものしか見に行きません。

apacheのモジュールなんて作ったことありませんが、ソースを読んでみました。
まあ、apacheのAPIを知らないんで、最初はさっぱりだったわけですが、結局わかったのは、SetEnvIfDNSBLの最初の引数が同じだと、複数の設定を内部的にひとまとめにするための処理があるということでした。
mod_setenvdnsbl.cの217-255行目あたりです。

この設定の場合、remote_addr という行が複数あるので、これらをひとまとめにしようとします。
が、内部のデータ構造にはDNSBLは一つの設定ごとに一つだけしか用意されていませんので、最初のDNSBLのドメインしか残らないわけです。
単純にこの処理を省いてやるだけで要求通り動くようになりました。

本来は、1つのDNSBLへのリクエストを1回にするための処理なのかなと予想したのですが、それにしては、データ構造がそれらしくないんですよね。

こんなわけで、最近Javaばかりだったんですが、久しぶりにC言語をさわりました。

これをやって収穫があったとすれば、DNSBLのクエリの仕組みを初めて知ったことですね。
恥ずかしながら、今まで知りませんでした。プロトコルがDNSだから、DNSBLだったとは。
確かにクエリも軽いし、プログラムも書きやすいですね。
あとは、apacheのモジュールの作り方がなんとなく見えたことですかね。

スパム対策?そういえばそれもありました(^^;

結局、ブラックリストだけでは駄目なので、キーワードベースのフィルタにキーワードを追加して、厳しめにしてみました。
DBには入りますが、スパムが公開されてしまうことは防げます。結局これが一番効いたような…

投稿者 shingo : 19:31 | トラックバック