1.023world - ヤドカリパークとマリンアクアリウム -

海洋の仕組みと細菌・微生物から学ぶマリンアクアリウムサイト

1.023world Facebook

結果 Oh! Life (旧ブログ)

懲りずに書いてみたりする結果オーライな日記

IP Lookup

昨年リニューアルした新掲示板「BBSちゃんぷる」ですが、最近スパム投稿が目立ってきたので、スパム判定分の投稿リクエストは拒否するように変更しました。
例のいじわるな晒しモン遊びも面白かったんだけど。。。汗
その代わりスパム判定分については、今後のためIPやホストをスパムデータとして蓄積すべく、中でこっそり記録するようにしました。

そこで、IPやホストだけじゃなく、ロケーションも取れたら管理しやすいのになぁ、と思って調べていたら、便利なAPI を見つけました。

IP Address Lookup - www.hostip.info

アメリカのサービスですが、フォームによるIP解析以外に、API 版 も提供されています。
精度は完全ではありませんが、実際に試してみたところ特に不満は無し。
なによりフリーなので文句のつけようがありません(汗)

今回はこのAPI を使って、スパムの発信源をおよそ検討つけることにしました。
で、ここ最近網にかかったスパムデータはこんな感じ。

最近のスパムリスト例

DATE FROM IP HOST
2009/02/23 15:47:00 IT 212.123.**.** static-212-123-**-**.clienti.tiscali.it
2009/02/23 09:15:05 CN 218.206.**.**
2009/02/22 15:04:20 XX 79.99.**.** srv**.swis.nl
2009/02/22 00:23:31 XX 88.216.**.** eth-54-84.marsatas.lt
2009/02/21 13:54:43 JP 220.15.**.** softbank220015****.bbtec.net
2009/02/21 11:05:55 XX 116.11.**.**

一部伏せ字で自主規制(笑)

FROMの列が今回 hostip.info のAPI から取得した地域名です。
ちなみに判定できなかった場合はXXが返ってきます。

hostip では用途によってAPI もいくつか用意されていますし、API からのレスポンスにもいくつかの返り値があるので、好みのAPI・値を利用するといいでしょう。

API の利用例 (IP to XML の場合)

リクエストURL : http://api.hostip.info/?ip=12.215.42.19
レスポンスXML :
<?xml version="1.0" encoding="ISO-8859-1" ?>
<HostipLookupResultSet
 version="1.0.0"
 xmlns="http://www.hostip.info/api"
 xmlns:gml="http://www.opengis.net/gml"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.hostip.info/api/hostip-1.0.0.xsd">
 <gml:description>This is the Hostip Lookup Service</gml:description>
 <gml:name>hostip</gml:name>
 <gml:boundedBy>
  <gml:Null>inapplicable</gml:Null>
 </gml:boundedBy>
 <gml:featureMember>  <Hostip>
   <gml:name>Sugar Grove, IL</gml:name>
   <countryName>UNITED STATES</countryName>
   <countryAbbrev>US</countryAbbrev>
   <!-- Co-ordinates are available as lng,lat -->
   <ipLocation>
    <gml:PointProperty>
     <gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
      <gml:coordinates>-88.4588,41.7696</gml:coordinates>
     </gml:Point>
    </gml:PointProperty>
   </ipLocation>
  </Hostip>
 </gml:featureMember>
</HostipLookupResultSet>

www.hostip.info/use.html より

僕はシンプルな <countryAbbrev> 要素の値を使いました。
その他、 <countryName>UNITED STATES</countryName><gml:name>Sugar Grove, IL</gml:name> も使い道がありそうですね。

ちなみに取得方法は、掲示板から直接ソケットで通信し、返ったXMLをパースしてます。
パースと言っても欲しいとこだけ正規表現で抜いてるだけですけどね(汗)
たとえば、

(join("",@socket)) =~ /<countryAbbrev>(.*?)</countryAbbrev>/;
my $from = $1;

みたいな。

こちらのエントリーもどうぞ♪