WEBサイトを運営していると何やら怪しいアクセスが!!
簡単そうで簡単ではない海外からのアクセスの見分け方
WEBサイトを運営していると、WEBサーバのアクセスログを見ると海外から怪しいアクセスが多数あることに気づきます。さらに、ショッピングサイトを運営していると、架空の住所宛に買い物されたり、クレジットカードを不正利用されたりといった不正行為の被害にあることがあります。
このとき、ユーザーのアクセス元を見ると、海外からアクセスしているケースが非常に多いのではないでしょうか。
ここでいう海外というのは、必ずしも物理的に海外からアクセスしているのではなく、海外のIPアドレスを利用してアクセスしているケースが大半かと思います。
そこで、海外IPアドレスからのアクセスをできなくする、または海外IPアドレスからショッピングができなくする必要が発生します。
海外からのアクセスと判断するには?
海外からのアクセスかどうかの判断はIPアドレスで行います。
このIPアドレスで判断するためには下記のような方法があります。
(1)IPアドレスのリストを提供する組織からダウンロードする
(2)DNSリバースルックアップ
(3)IPアドレスから国情報などを取得できるAPIの利用
(1)については基本無料です。IPアドレスのリストをローカルのデータベースに格納し、ユーザーのIPアドレスが日本のIPアドレスの範囲にあるかどうかをチェックすることができます。メリットは無料です。しかし、リストは常に最新のものをダウンロードする必要がある、ローカルデータベースを利用する必要があるなど作りこみが必要となってきます。さらに、必ずしもIPアドレスがすべての日本からのものを含んでいないケースがあります。
(2)DNSリバースルックアップとは、名のごとくDNSを利用した方法です。nslookupを使ったことがある人も多いかと思います。この方法ではnslookupを利用します。nslookupを利用しIPアドレスからホスト名を取得し、そのホスト名に含まれる情報からアクセス元の地域を推測する方法です。この方法は、IPアドレスを逆引きして、どのドメイン(ホスト名)に関連付けられているかを調べ、それによっておおまかな地域を判断する手段です。
例えば、日本のインターネットプロバイダーによって割り当てられたIPアドレスのホスト名には、「.jp」が含まれていることが多いため、これを基に国内のアクセスか海外のアクセスかを推測できます。取得した結果の文字列に「.jp」が含まれているかどうかをInStr
関数を使ってチェックします。含まれていれば日本国内からのアクセスと判断し、含まれていなければ海外からのアクセスと判断します。
下記は、VBAを利用したサンプルです。
Sub CheckIpWithDns()
Dim ipAddress As String
ipAddress = "123.45.67.89" ' 判定したいIPアドレス
Dim command As String
command = "nslookup " & ipAddress
' WScript.Shell を使って nslookup コマンドを実行し、その結果を取得
Dim result As String
result = CreateObject("WScript.Shell").Exec(command).StdOut.ReadAll
' 結果のホスト名に基づいて地域を判定する
If InStr(result, ".jp") > 0 Then
MsgBox "国内からのアクセスです。"
Else
MsgBox "海外からのアクセスです。"
End If
End Sub
このサンプル同様の処理をAPIなりDLLを作れば利用できそです。
ただし、こちらにもデメリットがあります。
この方法では取得した結果の文字列に「.jp」が含まれているかどうかをInStr
関数を使ってチェックします。含まれていれば日本国内からのアクセスと判断し、含まれていなければ海外からのアクセスと判断します。しかし、「.jp」が日本国内からなのに含まれないケースがあるのです。
(3)IPアドレスから国情報などを取得できるAPIの利用についてですが、最もプログラムなどの負担がすくなく容易に実現できる手段です。
IP Geolocation API
を利用します。
IPアドレスから国情報を取得するために、IP Geolocationサービスを提供するAPIを使う方法です。
これを使うと、下記のようにコーディングするだけで簡単に海外からのアクセスかどうかをチェックできます。
$access_key = 'YOUR_ACCESS_KEY'; // IP Geolocation APIのアクセスキー
$ip_address = $_SERVER['REMOTE_ADDR']; // クライアントのIPアドレスを取得
$url = "http://api.ipstack.com/$ip_address?access_key=$access_key";
$response = file_get_contents($url);
$data = json_decode($response, true);
// 国コードを取得
$country_code = $data['country_code'];
// 国コードが「JP」でない場合は海外アクセスと判断
if ($country_code !== 'JP') {
echo "海外からのアクセスです。";
} else {
echo "国内からのアクセスです。";
}
このようにさまざまな方法がありますが、IP Geolocationを使うのが一番効率よく容易にできるのではないでしょうか。さまざまなプランがあるので一度ご確認されることをお勧めします。