酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

pythonでIPHubを使って接続元が悪意のあるユーザーかどうか判断する

アクセスしてきた相手をIPアドレスから信用してよいのかどうかを調べるためのWebサービス「IPHub」をpythonから実行してみました。

freeプランで2000リクエスト/日まで利用することができます。登録をするとメールが届くのでvalicationリンクをクリックすると、アプリKeyが発行されるのですが、IPHubからのメールはスパム扱いされるようで迷惑メールフォルダに入っていました。

curlで実行できるか確認する

Google PublicDNSの8.8.8.8を安全か確認してみました。

$ curl http://v2.api.iphub.info/ip/8.8.8.8 -H "X-Key: MY_APPLICATION_KEY"

IPHub APIのレスポンスはJSONで返ってきます。

{
  "ip": "8.8.8.8",
  "countryCode": "US",
  "countryName": "United States",
  "asn": 15169,
  "isp": "GOOGLE",
  "block": 1,
  "hostname": "8.8.8.8"
}

よく「中国からのアクセスは弾きたい」という要望を聞きますので、そのような場合にはcountryCodeの値で判断してもよいかもしれません。もしくはcountryCodeの値がJPの場合のみアクセスを許容するといった使い方でしょうか。

IPHubが推奨するブロックレベルについて

IPHubのドキュメントを読むとblockの値で相手のリクスレベルを判断してくださいとあります。

説明
0 住居/未分類IP (安全)
1 居住者以外のIP (プロバイダ、プロキシなど)
2 非住宅&居住用IP

IPHubはblockの値が1かどうかを判断することで、悪意のあるユーザーを除外しつつ誤認識を避けた最適なバランスになるとかかれていました。

僕は普段auのiPhoneからテザリングでネットをしているのですがIPアドレスは106.133.13.1となっていました。これはKDDIが公開している情報と一致しています。

IPHub上での情報はどのようになっているか確認してみました。iPhone

{
  "ip": "106.133.13.1",
  "countryCode": "JP",
  "countryName": "Japan",
  "asn": 2516,
  "isp": "AS2516",
  "block": 2,
  "hostname": "106.133.13.1"
}

pythonでIPHubを使って接続元が悪意のあるユーザーかどうか判断する

IPHubのサンプルコードをそのままですが、以下のように簡単にblockレベルを調べることができました。

import urllib.request
import json

def Lookup(ip):
    response = urllib.request.Request("http://v2.api.iphub.info/ip/{}".format(ip))
    response.add_header("X-Key", "MY_APPLICATION_KEY")
    try:
        response = json.loads(urllib.request.urlopen(response).read().decode())
    except:
        return False
    return response.get("block")


if __name__ == '__main__':
    print(Lookup("106.133.13.1"))

# 2