头像

jlqwer

这让人揪心的代码

  2周前  •    WEB, 代码, 笔记  •    , ,   •    91  •    2

仅仅通过UA来判断来访者是不是蜘蛛肯定是不行的,那只是请求中的一个字段而已,想填写什么都行,从国内的几个搜索引擎来说,只有360把自家蜘蛛服务器的ip地址段公布了出来,其他并不提供自家服务器的IP,不过都提供了另一个方法,那就是用rDNS来验证。

PHP有个函数,可以通过IP来反查域名,gethostbyaddr($ip) ,如果没有查到对应的域名就会返回输入的参数,也就是我们提供的IP;

并且,蜘蛛IP的rDNS都是有规则的,所以可以有以下代码:

PHP<?php
$ua="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)";
$ip="220.181.108.103";
function getrdns($ip)
{
        return gethostbyaddr($ip);
}
function reip($ip)
{
        return str_replace(".","-",$ip);
}
function chekrdns($ua,$ip)
{
        if(stripos($ua,"Baiduspider")!==false)
        {
                return getrdns($ip)==("baiduspider-".reip($ip).".crawl.baidu.com");
        }
        else if(stripos($ua,"Sogou web spider")!==false)
        {
                return getrdns($ip)==("sogouspider-".reip($ip).".crawl.sogou.com");
        }
        else if(stripos($ua,"Googlebot")!==false)
        {
                return getrdns($ip)==("crawl-".reip($ip).".googlebot.com");
        }
        else if(stripos($ua,"bingbot")!==false)
        {
                return getrdns($ip)==("msnbot-".reip($ip).".search.msn.com");
        }
        else if(stripos($ua,"Mediapartners")!==false)
        {
                return getrdns($ip)==("rate-limited-proxy-".reip($ip).".google.com");
        }
        else
        {
                return false;
        }
}
echo chekrdns($ua,$ip);
?> 

我这里写了百度,搜狗,必应,谷歌和谷歌ads的判别(IP和UA自行获取),360并没有特定的rDNS(查了一下都是什么什么宽带),不过可以直接通过IP段判定,可以到360站长平台自己去找。

上一篇:
没有了,已经是最新文章啦

 评论


 已有2条评论

  1. 援军 冒泡 Windows 10 | 谷歌浏览器 70.0.3538.110 1周前

    确认了,是拍黄片大佬! 话说竟然还有反查函数真的惊了_(:3」∠)_

    • jlqwer 活跃 Linux | MIUI浏览器 10.4.0 1周前