昨年リニューアルした新掲示板「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;
みたいな。