|
D-WEBトップ | ニュース | スポーツ | 芸能 | 2024年カレンダー | ベストセラー | 料理レシピ百科 | ログファイル一覧 |
PHP - IPアドレスの計算方法 日本、海外 (2015/10/29) |
IPアドレスを入れると日本か海外が表示されます。 ブログにスパム?海外からアクセスit-azusaのトップに時々多量のアクセスがあります。ロボットでもなく、通常のアクセスでもないようです。アクセスログを調べていますが、米国だったり、他の国だったり、日本ではないようです。 IPアドレスのデータベースを作成IPアドレスは各国への割り当てが決まっているので、IPアドレスを調べれば、それが日本か海外かが分かります。日本のIPアドレスの一覧はJPNIC他いくつかのサイトが公開してくれています。ここでは、下記のサイトの一覧表テキストを使用しました。 60.236.0.0/14 60.254.192.0/18 61.4.128.0/19 61.4.160.0/20 : INSERT INTO `MST_IP` VALUES(60,236,0,0,14); INSERT INTO `MST_IP` VALUES(60,254,192,0,18); INSERT INTO `MST_IP` VALUES(61,4,128,0,19); INSERT INTO `MST_IP` VALUES(61,4,160,0,20); : IPアドレスの計算方法これでデータベースには5個の数値コラムができましたが、このままでは入ってきたIPアドレス(例えば60.238.xxx.xxx)が範囲内にあるかどうか、簡単には分かりません。そこで、先頭アドレスと終了アドレスのコラムを作る必要があります。 60.236.0.0/14 の場合 $max = ip2long('255.255.255.255'); $ips = ip2long('60.236.0.0'); $bit = 14; $sft = 32 - $bit; $int = $max; $int = $int >> $sft; $int = $int << $sft; $sub = $int; $subの中身 11111111111111000000000000000000 ip2long()という関数は、ipをlong_intに変換するという意味だと思われますが、PHPにはlong_intの定義がないので、計算時には注意が必要です。 サブネットマスクのビットを反転します。ここでは反転した数値を$maxでマスクしています。 $sub = ~$sub & $max; $subの中身 111111111111111111 上記と同じ理由で64ビットの場合、反転しただけだと下記の数値になり、予定していた結果にはなりません。 1111 …… 1111100000000000000111111111111111111 $ipsと$subのORを計算すると、終了アドレスが出ます。 $ipe = $ips | $sub; 結果は、 $ips 1022099456 (60.236.0.0) $ipe 1022361599 (60.239.255.255) となり、60.238.xxx.xxxはこの範囲に入るこをが分かります。つまり国内からのアクセスということです。 この先頭アドレスと終了アドレスをMySQLに登録して検索できるようにします。ただしそのままint定義のコラムにセットするとおかしな数値になることがあるので注意が必要です。理由は上記と共通なところもありますが、整数は一番上のビットをマイナスとして扱う性質があるからです。そのため今回は12桁のdecimalとして登録しました。正常に動作しています。 |
スポンサー リンク
|