服务热线
1888888888
作者:文煞发布时间:2024-07-22分类:PHP笔记浏览:5326
本文介绍PHP如何识别蜘蛛的真实性,主要是通过一些组合手段对搜索引擎蜘蛛的真实性进行判断,让虚假蜘蛛无处可逃。我知道部分站长为了安全起见,都会屏蔽假人访问,但是会对蜘蛛敞开大门,如果这时候有人伪装成蜘蛛,对你的网站为所欲为,那岂不是没有一点安全感吗?之前我介绍过PHP如何识访问者是不是搜索引擎的机器(参考文章《PHP如何识别蜘蛛:全网最新最全蜘蛛整理》),这里就不对识别蜘蛛的方法进行详细介绍了,本文主要是介绍如何识别蜘蛛的真假。
判断蜘蛛的真假之前,我们先来识别蜘蛛。为后面的真假判断工作做好服务。
<? php $tmp= '['.$_SERVER['HTTP_USER_AGENT']. ']'; //获取访问者UA,这里在UA数据前后都加了一个']'符号,也可以不用增加。 $tmp= strtolower($tmp); $ipAddress= $_SERVER['REMOTE_ADDR']; //获取访问者的IP地址 if (strpos($tmp, 'google') !==false) { $bot= '谷歌蜘蛛'; } else if (strpos($tmp, 'bing') > 0) { $bot= '必应蜘蛛'; } else if (strpos($tmp, 'baidu') > 0) { $bot= '百度蜘蛛'; } else if (strpos($tmp, 'bytespider') > 0) { $bot= '头条蜘蛛'; }
以百度蜘蛛为例,网络上很多大牛说不同IP段的百度蜘蛛代表不同的蜘蛛性质,但是该信息并没有得到百度的确认,可能大部分是依靠这些大牛通过大量数据分析而得,均是经验之谈。我收集了部分百度蜘蛛的IP,分享在下面:
116.179.32.*:新版百度蜘蛛,高权重段,一般抓取文章页。IP 段位于山西阳泉联通。百度云计算阳泉中心位于世界最大中文搜索引擎百度公司创始人李彦宏的家乡山西省阳泉经济开发区东区。
220.181.108.75:重点抓取更新文章的内页达到 90%,8%抓取首页,2%其他。权重 IP 段,爬过的文章或首页基本 24 小时放出来。 220.181.108.77:专用抓首页 IP 权重段,一般返回代码是 304 0 0 代表未更新。
220.181.108.80:专用抓取首页 IP 权重段,一般返回代码是 304 0 0 代表未更新。
220.181.108.82:抓取tag页面。
220.181.108.83:专用抓取首页 IP 权重段,一般返回代码是 304 0 0 代表未更新。
220.181.108.86:专用抓取首页 IP 权重段,一般返回代码是 304 0 0 代表未更新。
220.181.108.89:专用抓取首页 IP 权重段,一般返回代码是 304 0 0 代表未更新。
220.181.108.91:属于综合的,主要抓取首页和内页或其他,属于权重 IP 段,爬过的文章或首页基本 24 小时放出来。
220.181.108.92:同上 98%抓取首页,可能还会抓取其他 (不是指内页),属于权重 IP 段此段爬过的文章或首页基本 24 小时放出来。
220.181.108.94:专用抓取首页 IP 权重段,一般返回代码是 304 0 0 代表未更新。
220.181.108.93:重点抓取内页,爬过的文章或首页基本 24 小时放出来。
220.181.108.95:这个是百度抓取首页的专用 IP,如是 220.181.108 段的话,基本来说你的网站会天天隔夜快照。
...此处省略一万个汉字...
这里就不对蜘蛛的IP段进行全面的展示了,免得把话题扯远了,大家可以去网上自行收集百度蜘蛛的所有IP地址。接着上面的PHP代码:
$baiduips=['220.181.108.75', '220.181.108.80', '220.181.108.82', '220.181.108.89', '220.181.108.94', '220.181.108.95']; if ($bot== '百度蜘蛛') { foreach($baiduips as $value) { if ($ipAddress== $value) { $bot= '百度蜘蛛[真]'; } else { $bot= '百度蜘蛛[假]'; } }
使用IP对蜘蛛的真假性进行判断需要你搜集的IP足够全面和准确,否则会影响我们对蜘蛛真假判断的准确性。其他蜘蛛的IP需您自行进行收集。
如果你搜集的蜘蛛IP数据不够全面,但你依然使用了IP地址比对方法来进行判断,我们还可以通过查询蜘蛛IP的DNS记录进行判断,增加可靠性。想要查询一个IP的DNS记录,我们可以使用PHP内置函数gethostbyaddr()来进行查询,如果没有查询到IP的DNS记录就会返回原IP。接着上面的PHP代码:
if ($bot= '百度蜘蛛[假]') { $domainName= gethostbyaddr($ipAddress); //获取IP的DNS记录 if (strpos($domainName, 'baidu.com') !==false) { $bot= '百度蜘蛛[真]'; } else { $bot= '百度蜘蛛[假]'; } }
以上代码只是对百度蜘蛛进行了简单的判断,本文分享几个其他的主要蜘蛛的DNS记录:
百度蜘蛛:DNS记录需包括(baidu.com)
谷歌蜘蛛:DNS记录需包括(googlebot.com)
必应蜘蛛:DNS记录需包括(search.msn.com)
头条蜘蛛:DNS记录需包括(compute.amazonaws.com)
以上这四个蜘蛛是分析于我网站的蜘蛛数据,至于同一个蜘蛛是否还有其他的DNS记录,需要更多的数据进行分析,或者搜索引擎官方的通告。
通过通过查询蜘蛛IP的DNS记录进行判断蜘蛛的真假是否可行呢?我们可以写个简单的代码进行测试一下:
<? php // 假设$ip是您想查询的IP地址 $ipAddress= '220.181.108.75'; // 执行逆向 DNS 查询 $domainName= gethostbyaddr($ipAddress); // 打印结果 if ($domainName) { echo "IP地址:".$ipAddress. 'DNS记录:'.$domainName; } else { echo "无DNS记录:".$ipAddress; } if ($ipAddress== gethostbyaddr($ipAddress)) { echo '无耻!'; } else { echo '牛逼!'; } ?>
注释:该代码取了一个我们前面收集的百度蜘蛛IP中的几个个IP进行测试。
测试一:百度IP220.181.108.75
测试结果:IP地址:220.181.108.75DNS记录:baiduspider-220-181-108-75.crawl.baidu.com
测试二:百度IP220.181.108.91
测试结果:IP地址:220.181.108.91DNS记录:baiduspider-220-181-108-91.crawl.baidu.com牛逼!
测试三:谷歌蜘蛛IP66.249.71.9
测试结果:IP地址:66.249.71.9DNS记录:crawl-66-249-71-9.googlebot.com牛逼!
可见该方法对一些正规的蜘蛛还是比较适用的。而且比蜘蛛IP比对法省事得多。
本文主要介绍了通过蜘蛛IP地址判断蜘蛛的真假和通过查询蜘蛛IP的DNS记录来判断蜘蛛的真假,通常情况下,两种发放一起用,可以提供准确率。基本上可以排除大部分通过技术手段伪造的假蜘蛛。
在这里我还分析几个异常的UA特征:
Wordup-1 PycURL curl/7.29.0 okhttp python Python-urllib/3.10 Dalvik/2.1.0 Go-http-client/1.1 Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0
如果你的UA数据能够匹配这些UA特征,可以直接封禁,通过我自身网站的数据进行分析判断,他们基本没有干啥好事。当然UA数据为空的也可以屏蔽掉,基本都是机器。
分享:
支付宝
微信