「スパムちゃんぷるーDNSBL」Ruby版

2008/11/02

livedoorラボ「EDGE」が先日公開したスパム排除サービス「スパムちゃんぷるーDNSBL」のPHPモジュールを作ったかたがいたので僕もRuby版を作ってみました。

ご自由に利用していただいて結構です(といっても小さなプログラムですが...)。

動作環境

ruby-1.8.6

使い方

チェックしたいIPアドレスを引数に渡すと以下の結果が返ります。

ret = CheckSpamIP(ip)
true

・SPAM発信元IPアドレスの可能性がある

・IPアドレスとして不適当

false

・SPAM発信元IPアドレスではない

ソース

require 'socket'

def CheckSpamIP(check_ip = nil)
  # スパムIPアドレス
  spam_ip = "127.0.0.2"

  # IPアドレスが不当な場合はスパムとみなす 
  # (単純にXXX.XXX.XXX.XXXかどうかだけチェック)
  return true if check_ip !~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/

  # IPアドレス逆順並べ替え(AAA.BBB.CCC.DDD -> DDD.CCC.BBB.AAA)
  ip_rev = check_ip.split(".").reverse.join(".")

  # 検索ドメイン生成
  host = "#{ip_rev}.dnsbl.spam-champuru.livedoor.com"

  # ドメイン正引き
  begin
    ip = IPSocket.getaddress(host)
  rescue                    # 正引き失敗時はスパム元IPアドレス以外と判断
    return false
  end

  # 正引き後アドレス判定
  if ip == spam_ip          # スパム
    return true
  else                      # スパム以外
    return false
  end

end

テスト

(ソース)

iplist = [
  "192.0.2.1",              # スパム判定用
  "59.106.108.86",          # www.hatena.ne.jp
  "203.131.197.197",        # www.livedoor.com
  "1.2.3",                  # IPアドレス不正
  "",                       # IPアドレス不正
]

iplist.each {|ip|
  ret = CheckSpamIP(ip)
  puts "#{ip} -> #{ret}"
}

(結果)

192.0.2.1 -> true
59.106.108.86 -> false
203.131.197.197 -> false
1.2.3 -> true
 -> true

(2008/11/7追記)

livedoorラボ「EDGE」開発日誌スパムちゃんぷるーDNSBLで当エントリを紹介して頂きました。ありがとうございます。

(2008/11/26追記)

elecstaさんが作られたPython版に僕のコードを使っていただきました。ありがとうございます。