Asial Blog

Recruit! Asialで一緒に働きませんか?

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

カテゴリ :
バックエンド(プログラミング)
タグ :
Tech
PHP
spam
class
こんにちは、いつもブログネタなしで泣いてる亀本です。


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

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

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


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

  1. % sudo pear install Net_DNS

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

  1. <?php
  2. require_once 'Net/DNS.php';
  3.  
  4. /**
  5.  * Services_SpamChampuru_DNSBL
  6.  *
  7.  * @author Daichi Kamemoto(a.k.a yudoufu) <daichi@asial.co.jp>
  8.  * @version 0.0.1
  9.  */
  10. class Services_SpamChampuru_DNSBL
  11. {
  12.   private static $domain = 'dnsbl.spam-champuru.livedoor.com';
  13.   private static $spam_result = '127.0.0.2';
  14.   private $timeout = 0.1;
  15.   private $nameservers = array();
  16.  
  17.   /**
  18.    * constructor
  19.    *
  20.    * @param integer $timeout
  21.    * @param array $nameservers
  22.    */
  23.   public function __construct($timeout = null, $nameservers = null)
  24.   {
  25.     if (!is_null($timeout))
  26.     {
  27.       $this->timeout = $timeout;
  28.     }
  29.  
  30.     if (!is_null($nameservers))
  31.     {
  32.       if (!is_array($nameservers))
  33.       {
  34.         $nameservers = array($nameservers);
  35.       }
  36.       $this->nameservers = $nameservers;
  37.     }
  38.   }
  39.  
  40.   /**
  41.    * lookup
  42.    *
  43.    * @param string $ip_addr
  44.    * @return integer $score SPAM is 1, HAM is 0
  45.    */
  46.   public function lookup($ip_addr)
  47.   {
  48.     $score = 0;
  49.  
  50.     $reverse_ip_addr = implode('.', array_reverse(explode('.', $ip_addr)));
  51.     $dnsbl_request = $reverse_ip_addr . '.' . self::$domain;
  52.     
  53.     if (self::$spam_result === $this->_dns_lookup($dnsbl_request))
  54.     {
  55.       $score = 1;
  56.     }
  57.  
  58.     return $score;
  59.   }
  60.  
  61.   /**
  62.    * _dns_lookup
  63.    *
  64.    * @param string $dnsbl_request
  65.    * @return string $result
  66.    */
  67.   private function _dns_lookup($dnsbl_request = null)
  68.   {
  69.     $result = null;
  70.     $resolver = new Net_DNS_Resolver(array(
  71.                   'nameservers' => $this->nameservers,
  72.                   'tcp_timeout' => $this->timeout,
  73.                 ));
  74.  
  75.     if ($response = $resolver->query($dnsbl_request))
  76.     {
  77.       foreach ($response->answer as $rr)
  78.       {
  79.         if ($rr->type === 'A')
  80.         {
  81.           $result = $rr->address;
  82.           break;
  83.         }
  84.       }
  85.     }
  86.     return $result;
  87.   }
  88. }
  89.  
  90.  
  91. if (count(debug_backtrace())) return;
  92. // Sample Code
  93.  
  94. $dnsbl = new Services_SpamChampuru_DNSBL();
  95. $res = $dnsbl->lookup('192.0.2.1');
  96.  
  97. var_dump($res);

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

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

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

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