大家好,又见面了,我是你们的朋友全栈君。
方案一 使用淘宝接口
代码语言:javascript复制 /** * 使用淘宝接口 判断ip * @param $ip * @return bool */
public function judgeIpByTaobao($ip) {
$url = "http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
$res = file_get_contents($url);
if (!empty($res)) {
$ipData = json_decode($res,true);
if ($ipData['code']==0 && in_array($ipData['data']['country_id'],['CN','HK','TW'])) {
return true;
}
}
return false;
}
方案二 定期获取Apnic分配给中国的IP网段 列表
Apnic是全球5个地区级的Internet注册机构(RIR)之一,负责亚太地区的以下一些事务: (1)分配IPv4和IPv6地址空间,AS号 (2)为亚太地区维护Whois数据库 (3)反向DNS指派 (4)在全球范围内作为亚太地区的Internet社区的代表
1) 使用shell定期获取IP网段列表
代码语言:javascript复制curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F| '{ printf("%s/%dn", $4, 32-log($5)/log(2)) }' >china_ip.txt
最终得到的IP网段数据如下
代码语言:javascript复制1.0.1.0/24
1.0.2.0/23
1.0.8.0/21
1.0.32.0/19
1.1.0.0/24
1.1.2.0/23
1.1.4.0/22
1.1.8.0/24
...省略.....
223.255.252.0/23
返回约8000个网段数据
2)使用函数判断指定IP是否存在指定网段中
代码语言:javascript复制/** * 给定一个ip 一个网段 判断该ip是否属于该网段 * @param $ip * @param $networkRange * @return bool 属于返回true 不属于返回false */
public static function judge($ip, $networkRange) {
$ip = (double) (sprintf("%u", ip2long($ip)));
$s = explode('/', $networkRange);
$network_start = (double) (sprintf("%u", ip2long($s[0])));
$network_len = pow(2, 32 - $s[1]);
$network_end = $network_start $network_len - 1;
if ($ip >= $network_start && $ip <= $network_end) {
return true;
}
return false;
}
3)把网段数据处理后 保存到redis中
使用网段掩码,ip2long函数进行相关计算得到网段的开始值与结束值(见上面的函数),根据自己的情况,选择最合适的数据结构,保存到redis中。
4)快速比较 指定IP使用ip2long函数得到ip转为整数的值,判断值是否在任一一个区间中。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/193211.html原文链接:https://javaforall.cn