使用场景
-
最近网站被大批量爬虫,导致cpu和内存100%网站负载100%,分析了网站访问日志,发现大量的爬虫采集程序访问网站,手段是通多采集插件或者爬虫软件对网站文章和路径大批量访问get请求。
-
屏蔽本省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;
}
?>
但是此方法已经失效了,淘宝提供的api已永久关停了,淘宝IP官方通知下线通告:
虽然淘宝IP关停了,但是我找到了百度地图,每天免费额度五千次,对于我这小站,妥妥的够用。
具体的流程如下:
第一步,登录百度地图开放平台 , 网址:https://lbsyun.baidu.com/apiconsole/key
第二步,申请开发者认证,申请个人认证或者企业认证,根据自身情况 ,一般申请后一两天就通过了
第三步,打开控制台,找到应用管理 > 我的应用
第四步,应用里选择白名单,留空白即可,不要填写IP
第五步,部署代码. 编辑主题目录下functions.php
,在里面添加以下代码:
function banip(){
date_default_timezone_set(PRC);
// 获取真实IP地址
$ip = $_SERVER['REMOTE_ADDR']; // 默认使用REMOTE_ADDR
if (!empty($_SERVER['HTTP_CLIENT_IP'])) { // 如果存在HTTP_CLIENT_IP,则使用它
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { // 如果存在HTTP_X_FORWARDED_FOR,则使用它
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
if (strpos($ip, ',') !== false) { // 如果返回多个IP地址,则取第一个
$ip = explode(',', $ip)[0];
}
}
// 请求百度地图API
$response = wp_remote_get(https://api.map.baidu.com/location/ip?ak=xxxxxxxx&ip={$ip});
if (is_wp_error($response)) {
// 处理请求失败的情况
// wp_die('无法获取IP地址信息,请稍后再试!');
} else {
$content = wp_remote_retrieve_body($response);
$json = json_decode($content, true);
// 检查状态码和响应内容
if ($json['status'] == 0 && !empty($json['content'])) {
header(Content-Type: application/json; charset=UTF-8);
if (strpos($json['content']['address'], 甘肃省) !== false) { // 或者使用 u7518u8083u7701
wp_die('本站已禁止甘肃IP来访,<br>但这或许并不是一扇紧闭的大门,想想办法~','感谢来访-Xie' Blog',array('back_link' => true, // 返回链接
)); // or exit('服务器正在维护,请稍后再来!');
}
} else {
// 处理错误情况
// wp_die('无法获取IP地址信息,请稍后再试!');
}
}
}
// 将函数挂载到get_header钩子上
add_action('get_header', 'banip');
其中,百度地图API中https://api.map.baidu.com/location/ip?ak=xxxxxxxx&ip={$ip}
的ak填写自己刚刚创建的应用AK即可
效果图如下:
晋级
如果你的IP也在这个范围被拦截了,有两种方法可以将你排除在外,一是开VPN,这个不多说,这里详细介绍一下第二种方法。
你需要在浏览器中设置一个自定义的HTTP头部或者Cookie来标识你自己。具体的操作步骤如下:
首先,你需要在浏览器中安装一个插件或者脚本来设置这些头部或者Cookie。有很多这样的插件或者脚本,比如EditThisCookie
。你可以在浏览器的应用商店中搜索和安装它们。
然后,你需要在插件或者脚本的设置界面中添加一个自定义的头部或者Cookie,并赋予它们一个随机生成的值。比如,你可以添加一个名为X-My-Identity
的头部,或者一个名为my_identity
的Cookie,并把它们的值设为一个随机字符串,比如3f5a8c9b2d4d8
。
最后,你需要在你的代码中检查$_SERVER[‘HTTP_X_MY_IDENTITY’]
或者$_COOKIE[‘my_identity’]
是否存在并且等于预设的值。如果是,就不拦截访问。比如,你可以在你的代码中添加如下的判断语句:
// 如果存在自定义的头部或者Cookie,并且值等于预设的值
if ((isset($_SERVER['HTTP_X_MY_IDENTITY']) && $_SERVER['HTTP_X_MY_IDENTITY'] == '3f5a8c9b2d4d8') || (isset($_COOKIE['my_identity']) && $_COOKIE['my_identity'] == '3f5a8c9b2d4d8')) {
// 不拦截访问
} else {
// 原来的拦截逻辑
}
这样,只有当你使用了设置了自定义头部或者Cookie的浏览器访问网站时,才能正常访问,其他人都会被拦截。
参考文章
https://baijiahao.baidu.com/s?id=1759338718247291801&wfr=spider&for=pc
https://baijiahao.baidu.com/s?id=1720680089848280817&wfr=spider&for=pc