站点图标 陌路寒暄

利用PHP(rDNS)判别搜索引擎蜘蛛真假

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

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

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

<?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 if(stripos($ua,"PetalBot")!==false) //华为-花瓣搜索
        {
                return getrdns($ip)==("petalbot-".reip($ip).".aspiegel.com");
        }
        else
        {
                return false;
        }
}
echo chekrdns($ua,$ip);
?>

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

退出移动版