「スパムちゃんぷるーDNSBL」をPHPから利用するServices_SpamChampuru_DNSBL

こんにちは、いつもブログネタなしで泣いてる亀本です。

昨日、livedoorが各所で利用しているというスパムフィルタ「スパムちゃんぷるー」のDNSBL(ブラックリスト)を利用できるサービス「スパムちゃんぷるーDNSBL」が公開されました。
今回は、これをPHPから利用するクラスを作成してみました。

作成といっても、CPANにあるWebService::Livedoor::SpamChampuru::DNSBLのPHP移植です。
またか!と思ったあなたは、僕の記事を見すぎです。

またCodeReposに入れるかなー、と思っていましたが、細かすぎてそこまでのものでもない気がしたので、とりあえず以下に貼り付けておきます。
もうちょっと改変したり、スパムちゃんぷるー関連のその他API等が増えてきたら、そのうちまとめて入れようと思います。

利用に関してですが、このクラスは外部ライブラリとしてPEARのNet_DNSを利用、さらにそのNet_DNSがPHPのmhashモジュールを利用しています。
そのため、このクラスを使用する際には、まずPHPを再コンパイルするなどしてmhashモジュールを有効にした後、


% sudo pear install Net_DNS

としてNet_DNSをインストールして置く必要があります。。


<?php
require_once 'Net/DNS.php';
/**
 * Services_SpamChampuru_DNSBL
 *
 * @author Daichi Kamemoto(a.k.a yudoufu) <daichi@asial.co.jp>
 * @version 0.0.1
 */
class Services_SpamChampuru_DNSBL
{
  private static $domain = 'dnsbl.spam-champuru.livedoor.com';
  private static $spam_result = '127.0.0.2';
  private $timeout = 0.1;
  private $nameservers = array();
  /**
   * constructor
   *
   * @param integer $timeout
   * @param array $nameservers
   */
  public function __construct($timeout = null, $nameservers = null)
  {
    if (!is_null($timeout))
    {
      $this->timeout = $timeout;
    }
    if (!is_null($nameservers))
    {
      if (!is_array($nameservers))
      {
        $nameservers = array($nameservers);
      }
      $this->nameservers = $nameservers;
    }
  }
  /**
   * lookup
   *
   * @param string $ip_addr
   * @return integer $score SPAM is 1, HAM is 0
   */
  public function lookup($ip_addr)
  {
    $score = 0;
    $reverse_ip_addr = implode('.', array_reverse(explode('.', $ip_addr)));
    $dnsbl_request = $reverse_ip_addr . '.' . self::$domain;
    
    if (self::$spam_result === $this->_dns_lookup($dnsbl_request))
    {
      $score = 1;
    }
    return $score;
  }
  /**
   * _dns_lookup
   *
   * @param string $dnsbl_request
   * @return string $result
   */
  private function _dns_lookup($dnsbl_request = null)
  {
    $result = null;
    $resolver = new Net_DNS_Resolver(array(
                  'nameservers' => $this->nameservers,
                  'tcp_timeout' => $this->timeout,
                ));
    if ($response = $resolver->query($dnsbl_request))
    {
      foreach ($response->answer as $rr)
      {
        if ($rr->type === 'A')
        {
          $result = $rr->address;
          break;
        }
      }
    }
    return $result;
  }
}
if (count(debug_backtrace())) return;
// Sample Code
$dnsbl = new Services_SpamChampuru_DNSBL();
$res = $dnsbl->lookup('192.0.2.1');
var_dump($res);

実際に動かしてみればわかりますが、最後に記述したサンプルの通りlookupを実行すると、指定したIPがブラックリストに登録されていればint(1)、そうでなければint(0)が返ってきます。

# なお、スパムちゃんぷるーDNSBLのページにも記述がありますが、192.0.2.1はテスト用のIPで、必ずSPAM判定が戻ってきます。

ちょっとしたライブラリですが、お役にたてば幸いです。

追記:
id:MugeSoさんにNet_DNSBLというのがあることを教えてもらいました。
もっと汎用的にやりたいというひとは、こちらがいいかもしれません><