こんにちは、いつもブログネタなしで泣いてる亀本です。
昨日、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というのがあることを教えてもらいました。
もっと汎用的にやりたいというひとは、こちらがいいかもしれません><