专栏首页小维博客如何实现限制部分地区访问网站,且精确到国家/省/市IP地址

如何实现限制部分地区访问网站,且精确到国家/省/市IP地址

前言:作用分析

  1. 现在搭建网站,有面向国外的,有面向国外,还有一些是面向特定用户的。有朋友在其云否主机上搭建了外贸站,想要设置一下不让国内的竞争同行访问,需要精确到国内某一个省。要想达到这样的效果,就需要利用到IP库了。
  2. 现在市面上有不少的运营商提供免费的IP库API可供使用,例如淘宝的IP库、IPIP的IP库还有IP138的IP库,这些IP库都是比较精准的,而且官方提供了详细的PHP、JS、ASP等示例文档,有需要的朋友可以参考文档稍微修改就可以拿来用了。
  3. 需要注意的是,IP库在线查询一般会设置有一定的频率限制,例如淘宝的IP库如果一定时间内请求太快的话很容易就变成了502错误了,对企业用户可以选择这些IP库的付费版,可以解决免费IP库各个版本的限制。
  4. 对于一些离线的IP库,有的可能好久没有更新了,例如本文介绍的ipdatabase-二叉树快速搜索IP地址数据库,数据源采用2015年广告协会制定的IP地址标准数据库,中国互联网广告行业统一采用的标准IP库。
  5. 服务器屏蔽海外 IP 访问,有效拦截 DDOS 与 CC 攻击!研究发现很多网站被攻击都是来自海外的肉鸡,所以禁掉海外 IP 访问网站也是不错的防护手段,而且国内网站几乎很少有国外用户访问,称之为大局域网也不为过。

这篇文章就来搜集整理一下网站限制IP访问的方法,以及梳理一下国内外免费在线和离线的IP库,方便大家使用。

一、PHP代码实现禁止IP访问网站。

如果你想要禁止某一个国家的IP访问你的网站,请使用以下PHP代码:(将代码加入网站顶部或底部即可)

<?php
/**
 *
 * test.php(屏蔽国家IP)
 *
 */
$verification = '美国';//需要屏蔽国家的IP
function get_client_ip() { 
               $ip = $_SERVER['REMOTE_ADDR'];     
         if (isset($_SERVER['HTTP_X_REAL_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_FORWARDED_FOR'])) {            
         $ip = $_SERVER['HTTP_X_REAL_FORWARDED_FOR'];       
         }          
         elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_FORWARDED_FOR'])) {             
         $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];       
         }          
         elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {           
         $ip = $_SERVER['HTTP_CLIENT_IP'];       
         }          
         return $ip;    
         }
$ip = get_client_ip();//获取访客IP
$antecedents = $_SERVER['HTTP_REFERER'];//访客来路地址
$result = file_get_contents("http://ip.taobao.com/service/getIpInfo.php?ip=".$ip);//IP数据库来自淘宝。
$address = json_decode($result,true);
//判断访客是否属于美国,是否来自百度,是否来自谷歌
if($address['data']['country'] == $verification && strpos($antecedents, 'baidu') === false && strpos($antecedents, 'google') === false){
        sleep(10);//设置一个10秒等待。
        header('HTTP/1.1 503 Service Temporarily Unavailable');
        header('Status: 503 Service Temporarily Unavailable');
        header('Retry-After: 3600000');
        exit;
}
?>

如果你想要禁止某一个省份的IP访问你的网站,请使用以下PHP代码:

<?php
/**
 *
 * test.php(屏蔽地方IP)
 *
 */
$verification = '江西省';//需要屏蔽省份的IP
function get_client_ip() { 
               $ip = $_SERVER['REMOTE_ADDR'];     
         if (isset($_SERVER['HTTP_X_REAL_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_FORWARDED_FOR'])) {            
         $ip = $_SERVER['HTTP_X_REAL_FORWARDED_FOR'];       
         }          
         elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_FORWARDED_FOR'])) {             
         $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];       
         }          
         elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {           
         $ip = $_SERVER['HTTP_CLIENT_IP'];       
         }          
         return $ip;    
         }
$ip = get_client_ip();//获取访客IP
$antecedents = $_SERVER['HTTP_REFERER'];//访客来路地址
$result = file_get_contents("http://ip.taobao.com/service/getIpInfo.php?ip=".$ip);//IP数据库来自淘宝。
$address = json_decode($result,true);
//判断访客是否属于江西省,是否来自百度,是否来自谷歌
if($address['data']['region'] == $verification && strpos($antecedents, 'baidu') === false && strpos($antecedents, 'google') === false){
  sleep(99999999);//设置一个999999秒的等待。
  Header("HTTP/1.1 204 No Content");
  exit;
}
?>

聪明的朋友一定发现了以上代码其实还可以精确到市一级IP,你只需要替换成city就可以了,代码引用淘宝IP库的格式如下:

二、通过JS代码实现禁止IP访问网站。

  • 当特定省份和城市的IP访问你的网站时,使用以下代码可以弹出提示:
<script type="text/javascript" src="https://ip.ws.126.net/ipquery"></script>
<script>
var province=localAddress.province;//获取所在省,比如广东省
var city=localAddress.city;//获取所在市,比如广州市
//判断省
if(province.indexOf('广东')  != -1){
    alert(province);    
    }else{
        }
//判断市
if(city.indexOf('广州')  != -1){
    alert(city);    
    }else{
        }
</script>
  • 当特定省份和城市的IP访问你的网站时,使用以下代码跳转到某一个网址:(其它动作可以根据自定义)
<script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
<script>
$.getScript('https://ip.ws.126.net/ipquery', function(){  
     console.log(localAddress.city)
    if(localAddress.city.indexOf('北京') != -1||localAddress.city.indexOf('杭州') != -1||localAddress.city.indexOf('上海') != -1||localAddress.city.indexOf('广州') != -1||localAddress.city.indexOf('深圳') != -1||localAddress.city.indexOf('东莞') != -1||localAddress.city.indexOf('房山') != -1){        
       window.location.href = 'https://www.baidu.com';      
    }else{        
     return;      
    }
    console.log(localAddress.province)    
    if(localAddress.province.indexOf('福建') != -1){        
       window.location.href = 'https://www.baidu.com';      
    }else{        
     return;      
    }    
});
</script>

三、免费在线和离线IP库汇总。

3.1 淘宝IP库 http://ip.taobao.com/

访问方式:http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串],返回内容以json格式。优点:精准度非常高。不足之处:不支持Https。每个用户的访问频率需小于10qps。 示例:

#调用 
http://ip.taobao.com/service/getIpInfo.php?ip=171.208.203.169
#返回
{"code":0,"data":{"ip":"171.208.203.169","country":"中国","area":"","region":"四川","city":"乐山","county":"XX","isp":"电信","country_id":"CN","area_id":"","region_id":"510000","city_id":"511100","county_id":"xx","isp_id":"100017"}}

3.2 网易IP库 https://ip.ws.126.net/ipquery

示例:

#调用
https://ip.ws.126.net/ipquery?ip=171.208.203.169
#返回
var lo="四川省", lc="乐山市"; var localAddress={city:"乐山市", province:"四川省"}

3.3 搜狐IP库 http://pv.sohu.com/cityjson

3.4 IPIP.net IP库 https://www.ipip.net/support/api.html

IPIP.net IP免费接口,限速每天1000次,示例:

#调用
http://freeapi.ipip.net/118.28.8.8
#返回
["中国","天津","天津","","鹏博士"]

3.5 IP.la IP库 https://www.ip.la/

IP.la 是IPIP.net 搞的海外版,官网说“You can initiate requests without any limit.”示例:

<?php
    $ip = file_get_contents('https://api.ip.la');
    echo "My public IP address is: " . $ip;
?>

3.6 IP138 IP查询 http://user.ip138.com/ip/

示例:

#接口地址
http协议:http://api.ip138.com/query/
https协议:https://api.ip138.com/query/
#调用
http://api.ip138.com/query/?ip=8.8.8.8&callback=find&oid={oid}&mid={mid}&sign=签名算法

3.7 百度地图IP查询 http://lbsyun.baidu.com/

示例:

#调用
https://api.map.baidu.com/location/ip?ak=F454f8a5efe5e577997931cc01de3974&ip=118.28.8.8
#返回
{"address":"CN|\u5929\u6d25|\u5929\u6d25|None|DXTNET|0|0","content":{"address_detail":{"province":"\u5929\u6d25\u5e02","city":"\u5929\u6d25\u5e02","district":"","street":"","street_number":"","city_code":332},"address":"\u5929\u6d25\u5e02","point":{"y":"4715083.22","x":"13047990"}},"status":0}

3.8 腾讯位置服务 https://lbs.qq.com/webservice_v1/guide-ip.html

示例:

#调用
https://apis.map.qq.com/ws/location/v1/ip?ip=61.135.17.68&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77
#返回
{
    "status": 0,
    "message": "query ok",
    "result": {
        "ip": "61.135.17.68",
        "location": {
            "lng": 116.407526,
            "lat": 39.90403
        },
        "ad_info": {
            "nation": "中国",
            "province": "",
            "city": "",
            "district": "",
            "adcode": 110000
        }
    }
}

3.9 ipdatabase-二叉树快速搜索IP地址数据库 https://github.com/wzhe06/ipdatabase

数据源采用2015年广告协会制定的IP地址标准数据库,利用二叉树实现IP查询,首先将10进制IPV4地址转化为二进制构建二叉树,利用二叉树搜索进行搜索,示例:

public void example() throws Exception {
    String ip = "58.30.15.255";
    String region = IpHelper.findRegionByIp(ip);
    System.out.println(region);
}

3.10 ip2region-Binary,B树和纯内存三种查询IP库 https://github.com/lionsoul2014/ip2region

该数据聚合了一些知名ip到地名查询提供商的数据,每条ip数据段都固定了格式:城市Id|国家|区域|省份|城市|ISP,中国的数据精确到了城市,其他国家只能定位到国家。

示例:

#调用
php binding/php/testSearcher.php ./data/ip2region.db
#返回
initializing  B-tree ... 
+----------------------------------+
| ip2region test script            |
| Author: chenxin619315@gmail.com  |
| Type 'quit' to exit program      |
+----------------------------------+
p2region>> 101.105.35.57
2163|中国|华南|广东省|深圳市|鹏博士 in 0.02295 millseconds

3.11 纯真IP库 http://www.cz88.net/

四、总结。

总得来说,免费IP库还是挺多的,无论是付费的IP库或者是免费的IP库都不一定做到100%的准确,尤其是离线的IP库更需要及时更新才可以获取正确的信息。

离线IP库可移植性最强,你可以根据自己的需要整合到JS、PHP、ASP、C#、JAVA等当,在线的IP库API查询受网络以及频率限制的影响,不适用于大型的应用场景。

文章内容引自:挖站否 https://wzfou.com/ip-ku/

版权声明:本站原创文章 如何实现限制部分地区访问网站,且精确到国家/省/市IP地址 由 小维 发表! 转载请注明:如何实现限制部分地区访问网站,且精确到国家/省/市IP地址 - 小维的个人博客 部分素材来源于网络,如有侵权请联系删除!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 美图GeoIP服务实践(文末赠书券)

    3.用户画像及其他在线业务类:如美拍账号经济体系需要检测校验用户的常用登陆地信息。

    美图数据技术团队
  • 三分钟科普:LBS定位能力以及应用

    打开天气软件展示深圳天气、点外卖定位当前是大族科技大厦,这些习以为常的服务背后是怎么样的流程?

    刘小备
  • 关于IP,这里有你想知道的一切!

    用户1075292
  • 隐私 | 怎么聊着聊着就被定位了?

    如果你的QQ在线,就能知道你在哪个省和城市 现在有个第三方叫NRTqq 同样可以做到显示出具体的ip和地址信息 这样的第三方集成客户端,或者脚本还有很多 ...

    用户1631416
  • 漫话:如何给女朋友解释什么是CDN?

    周六晚上七点多,我正在看书呢,突然女朋友跑过来问我她的IPAD去哪了,火急火燎的。

    用户1564362
  • 学习什么是CDN

    周六晚上七点多,我正在看书呢,突然女朋友跑过来问我她的IPAD去哪了,火急火燎的。

    Java3y
  • nodejs获取客户IP并定位IP位置信息

    ip地址是我们用来记录用户访问信息的一个重要标识,一方面我们可以用来防止某一个IP地址带来的大量DDOS攻击,通过判断来阻止此IP访问,这是其中一种手段。另外一...

    OECOM
  • 漫话:如何给女朋友解释什么是CDN?

    周六晚上七点多,我正在看书呢,突然女朋友跑过来问我她的IPAD去哪了,火急火燎的。

    吴延宝
  • 教你如何获取IP地址侦测用户来源可视化分析

    假设一家商业网站开发了软件产品,他们希望知道都是来自哪里的用户下载或更新我们的软件,并进行可视化分析。

    华章科技
  • Django实现统计网站访问次数、访问 ip 、受访页面

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    菲宇
  • 浅谈信息收集的思路

    Christopher Hadnagy 社会工程-安全体系中的人性漏洞 社会工程 卷2:解读肢体语言 社会工程 防范钓鱼欺诈 卷3 信息安全技术管理 杰出全专家...

    C4rpeDime
  • 什么是域名?

    更希望记住 www.bilibili.com 还是 120.92.168.51 呢?

    小菠萝测试笔记
  • Python库之玩转Selenium

    哈哈,帅哥出场怎么没有一点掌声呢,小姐姐小哥哥噪起来,let's cheer up,打起精神开始学习咯~本周我们要分享的是什么呢?来说说网站的浏览量吧,毕竟咱们...

    石璞东
  • Pokémon Go 安全问题浅析

    *本文原创作者:ArkTeam circlezhou,本文属FreeBuf原创奖励计划,未经许可禁止转载 ? 眼下最活跃的AR(增强现实)手游口袋妖怪(Poké...

    FB客服
  • 踩过CDN大小十类坑

    干云服务这些年,服务过各类大客户,也遇到过各类问题,今天就简单总结记录一些,希望对大家有一定帮助。由于知识面有限,有些地方难免不周,也欢迎大家指正!

    Ching云服务杂论
  • 1亿元!腾讯云中标福建平潭全域智慧旅游工程 ​| 数字文旅周报43期

    ? ? 1亿元! 腾讯云中标福建平潭全域智慧旅游工程 近日,腾讯云以1亿元中标福建省平潭岛全域智慧旅游项目一期工程,双方将联手打造全国首个科技+文旅融合智...

    腾讯文旅
  • 女朋友突然问我DNS是个啥....

    今天晚上我正在床上躺着刷手机,然后我女朋友突然说她的电脑坏了。说连着WIFi上不了网,让我给她看一下。(这就是有个程序员男朋友的好处?)

    乱敲代码
  • 【史上最全】国内外常用精品API接口汇总

    API是获取网络服务最便捷的方式,合理地使用API开发项目可以大大提高开发效率,把精力都集中在程序的业务逻辑之上,避免重复造轮子。推荐给大家个人觉得很赞的第三方...

    凯哥Java
  • 几种方法有效屏蔽国外IP恶意扫描

    最近有朋友说,查看nginx访问日志,发现大量的恶意扫描,分析发现比正常业务访问量都大,且IP大部分来自国外,服务器用的按量付费,这刷的都是白花花的银子,想问下...

    李俊鹏

扫码关注云+社区

领取腾讯云代金券