分享一个如何通过简单的设置和配置,限制特定IP地址访问您的网站的方法。通过这些方法,您可以有效地控制谁可以访问您的网站,从而保护您的在线资源免受不必要的干扰。无论是为了安全还是其他原因,限制IP访问是一种有用的技能。
相关文章推荐:如何限制IP请求数和连接数
1.禁止IP访问网站
1.1.屏蔽国外IP
方法1:代码屏蔽
如果你想要禁止某一个国家的IP访问你的网站,可以参考以下代码(位置参考:Header.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;
}
?>
方法2:域名解析
利用域名解析禁止国外ip访问网站(这里以阿里云 DNS 解析为例):
先设置一个 A 记录类型,然后解析线路为"境外",最后把记录值设为:127.0.0.1
效果:
方法3:脚本屏蔽
该脚本适用于 CentOS、Debian、Ubuntu 等常用系统。用 shh 连接服务器运行以下命令:
wget https://blog.isww.cn/file/shell/block-ips.sh
chmod +x block-ips.sh
./block-ips.sh
封禁 ip 时会要求你输入国家代码,代码查看:点击进入。记住所填参数均为小写字母。比如 JAPAN (JP),我们就输入 jp 这个参数。
封禁IP:
查看封禁列表:
解封IP:
1.2.屏蔽地方IP
如果你想要禁止某一个省份的IP访问你的网站,可以参考以下代码(参考位置同上):
<?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即可
2.IP访问提示
2.1.弹出提示
当特定省份和城市的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>
2.2.指定跳转位置
当特定省份和城市的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>
此方法来自挖站否。
3.使用须知
在使用以上方法时,如果代码中提供的ip库失效,请自行百度其他ip库并替换即可。
直接VPS脚本的话,会不会误判CDN的ip呢
如果你使用的是简单的IP地址检测脚本,它可能会将CDN提供商的IP地址识别为终端用户的IP地址,从而造成误判
具体情况得具体分析
我最近就需要这个,老是有国外的给我留言,一看就是机器人写的。
只能作为参考而已,不一定100%准确,懂点技术可以自己优化。或者直接找专业的三方,一步到位
自己写防御还是有点累啊
能用可靠的第三方还是得用的,毕竟人家是专业的