2005-07-28 [長年日記]

_1 [Wiki] 史上最大の荒し...

やられました。1412 発の spam post をくらいました。

IP
69.50.187.85
User-Agent
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en)
Referer
http://wiki.fdiary.net/xxxx/./?c=edit;p=yyyy

あと気になる点は、数日前に同じアドレス (およびその周辺) から

User-Agent
curl/7.12.1 (i386-portbld-freebsd4.10) libcurl/7.12.1 OpenSSL/0.9.7d zlib/1.1.4

という嗅ぎ回るようなアクセスがありました。

対策としては、IP アドレスと User-Agent (前者も後者も) で Deny したうえで、ダサいけどこんなプラグインで /./ が含まれるアクセスをエラーにしました (本当は mod_rewrite で拒否したいけれど、正規化されてしまうようでうまくいかない)。

raise 'Permission Denied' if %r|/\./| =~ ENV['REQUEST_URI'] 

で、とにかく面倒だったのはその後の復旧です。'![ ... http://...zenno...' みたいな荒しだったので、こんなプラグインを書いて '?c=cleanup' で呼び出しました。

def cleanup
  print @cgi.header( 'type' => 'text/plain' )
  @db.page_info.collect{ |i| i.keys[0] }.each do |page|
    keyword = []
    @db.get_attribute(page, :keyword).each do |k|
      if /^!\[/ !~ k
        keyword << k
      else
        puts "#{page} - #{k}"
      end
    end
    @db.set_attribute(page, :keyword => keyword)
    if /^!\[.*zenno/ =~ @db.load( page )
      backup = @db.load_backup( page )
      if backup.nil? || backup.empty?
        @db.delete( page )
        delete_proc
        puts "d:#{page}"
      else
        md5 = @db.md5hex( page )
        save( page, backup, md5 )
        puts "u:#{page}"
      end
    end
  end
end

add_plugin_command( 'cleanup', nil )

今回の経験で、tDiary のようなフィルタ機構の必要性がわかりましたし、よりシンプルなデータ構造が望ましいこともわかりました。

そんなわけで、互換性をそれなりに残しながらもかなりの部分を再設計したい熱が高まってまいりました。

本日のツッコミ(全2件) [ツッコミを入れる]
_ ay (2005-07-28 23:35)

RewriteCond %{THE_REQUEST} "^\S+ .*/\./" みたいなのはどうでしょう。

_ かずひこ (2005-07-29 00:52)

おぉ、うまくいきました。%{THE_REQUEST} は初耳でした。ありがとうございます!

[]