php判断真假蜘蛛该怎么修改?

php 通过AU判定蜘蛛还是有bug,无法解决虚拟AU伪造蜘蛛访问!现在想改成host 和 ip的方式来判定,会的同学帮我看看该怎么修改!付费悬赏哦!

 function getip()
{
if($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]){
$ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
}
elseif($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]){
$ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
}
elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"]){
$ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
}
elseif (getenv("HTTP_X_FORWARDED_FOR")){
$ip = getenv("HTTP_X_FORWARDED_FOR");
}
elseif (getenv("HTTP_CLIENT_IP")){
$ip = getenv("HTTP_CLIENT_IP");
}
elseif (getenv("REMOTE_ADDR")){
$ip = getenv("REMOTE_ADDR");
}
else{
$ip = "Unknown";
}
return $ip;
}
//蜘蛛判定
$ip=getip();

   $tmp = $_SERVER['HTTP_USER_AGENT'];
 $isspider = 0;
if(strpos($tmp, 'pider') !== false){
    $isspider = 1;
}else if(strpos($tmp, 'Baiduspider') !== false || strpos($tmp, 'Baiduspider') !== false);
 else if(strpos($tmp, '360Spider') !== false || strpos($tmp, '360Spider') !== false);
 else if(strpos($tmp, 'Sougou web spider') !== false || strpos($tmp, 'Sougou web spider') !== false){
    $isspider = 1;
}

思路:
1.指定ip 和 ip段来判定蜘蛛。
2.通过nslookup 或其他方式判定是否为蜘蛛。
通过指定IP或ip段判定可能是最快的,若没匹配结果则通过nslookup获取匹配结果即可!

如果有比nslookup更快的方式可以更改,目的只有一个,快速精准判断真假蜘蛛!

注意:搜狗蜘蛛4.0 已经可以通过 nslookup 来判断
如果能实现AU加要改的判断,实现双判断,这样最好!会的同学快来捡钱了!速度哦!在线等待!

看起来您正在尝试修改 PHP 代码以从基于用户代理的蜘蛛检测切换到基于 IP 和主机名的检测。这是修改代码以实现此目的的一种方法:

function getip()
{
    if ($_SERVER['HTTP_X_FORWARDED_FOR']) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif ($_SERVER['HTTP_CLIENT_IP']) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

// Spider detection based on IP address and hostname
$ip = getip();
$hostname = gethostbyaddr($ip);

$isspider = 0;

// List of known spider IP addresses or IP ranges
$spider_ips = array(
    '66.249.64.0/19', // Google
    '72.14.192.0/18', // Google
    '209.85.128.0/17', // Google
    '66.102.0.0/20', // Google
    '74.125.0.0/16', // Google
    '64.233.160.0/19', // Google
    '216.239.32.0/19', // Google
    '64.68.90.1', // Bing
    '65.55.208.0/20', // Bing
    '65.54.0.0/16', // Microsoft
    '131.253.24.0/21', // Microsoft
    '157.55.0.0/16', // Microsoft
    '157.56.0.0/14', // Microsoft
    '157.60.0.0/16', // Microsoft
    '207.46.0.0/16', // Microsoft
    '157.52.0.0/16', // Microsoft
    '202.108.249.197', // Baidu
);

// List of known spider hostnames
$spider_hosts = array(
    'googlebot.com',
    'google.com',
    'bing.com',
    'msn.com',
    'search.live.com',
    'search.yahoo.com',
    'yandex.com',
    'baidu.com',
);

// Check if the IP address or hostname matches any known spider IP or hostname
if (in_array($ip, $spider_ips) || in_array($hostname, $spider_hosts)) {
    $isspider = 1;
}

// Double-check with user-agent-based spider detection
$tmp = $_SERVER['HTTP_USER_AGENT'];

if (strpos($tmp, 'pider') !== false) {
    $isspider = 1;
} else if (strpos($tmp, 'Baiduspider') !== false || strpos($tmp, 'Baiduspider') !== false) {
    $isspider = 1;
} else if (strpos($tmp, '360Spider') !== false || strpos($tmp, '360Spider') !== false) {
    $isspider = 1;
} else if (strpos($tmp, 'Sougou web spider') !== false || strpos($tmp, 'Sougou web spider') !== false) {
    $isspider = 1;
}


修改后的代码使用getip()获取客户端 IP 地址的函数和gethostbyaddr()获取客户端主机名的函数。然后它将 IP 地址和主机名与已知蜘蛛 IP 地址或范围列表以及已知蜘蛛主机名列表进行比较,以确定请求是否来自蜘蛛。
有用请采纳~


function is_spider() {
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    $referer = $_SERVER['HTTP_REFERER'];
    $ip = $_SERVER['REMOTE_ADDR'];

    // 判断IP和IP段
    if (preg_match('/^119\.63\.192\./', $ip) || preg_match('/^180\.76\.15\./', $ip)) {
        return true;
    }

    // 判断User-Agent
    if (strpos($user_agent, 'spider') !== false || strpos($user_agent, 'bot') !== false) {
        return true;
    }

    // 判断Referer
    if (strpos($referer, 'baidu.com') !== false) {
        return true;
    }

    return false;
}

该回答引用ChatGPT


function getip()
{
    if($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]){
        $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
    }
    elseif($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]){
        $ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
    }
    elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"]){
        $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
    }
    elseif (getenv("HTTP_X_FORWARDED_FOR")){
        $ip = getenv("HTTP_X_FORWARDED_FOR");
    }
    elseif (getenv("HTTP_CLIENT_IP")){
        $ip = getenv("HTTP_CLIENT_IP");
    }
    elseif (getenv("REMOTE_ADDR")){
        $ip = getenv("REMOTE_ADDR");
    }
    else{
        $ip = "Unknown";
    }
    return $ip;
}

//蜘蛛判定
$ip=getip();
$tmp = $_SERVER['HTTP_USER_AGENT'];
$isspider = 0;

if(strpos($tmp, 'pider') !== false){
    $isspider = 1;
}
else if(strpos($tmp, 'Baiduspider') !== false || strpos($tmp, 'Baiduspider') !== false);
else if(strpos($tmp, '360Spider') !== false || strpos($tmp, '360Spider') !== false);
else if(strpos($tmp, 'Sougou web spider') !== false || strpos($tmp, 'Sougou web spider') !== false){
    $isspider = 1;
}


根据您的需求,将判断蜘蛛的方式改为基于IP地址和主机名的方式。具体的修改代码如下:

function getip()
{
    if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] != ''){
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    elseif(isset($_SERVER['HTTP_CLIENT_IP']) && $_SERVER['HTTP_CLIENT_IP'] != ''){
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    }
    else{
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

// 蜘蛛判定
$ip = getip();
$hostname = gethostbyaddr($ip); // 获取主机名

$isspider = 0;
$spiders = array(
    'google' => array('googlebot.com'),
    'baidu' => array('baidu.com'),
    'bing' => array('msn.com'),
    'sogou' => array('sogou.com'),
    '360' => array('360.cn')
);

foreach ($spiders as $spider => $domains) {
    foreach ($domains as $domain) {
        if (stripos($hostname, $domain) !== false) {
            $isspider = 1;
            break 2;
        }
    }
}

if ($isspider) {
    // 处理蜘蛛访问
} else {
    // 处理非蜘蛛访问
}

上述代码中,getip() 函数用于获取客户端的IP地址,然后通过 gethostbyaddr 函数获取其主机名,这里使用一个 $spiders 数组,存储了一些蜘蛛的主机名,然后循环检查当前访问者的主机名是否匹配其中任何一个。如果匹配则说明访问者是蜘蛛,将 $isspider 标记为1,否则为非蜘蛛访问。

注意:这种方式也有可能被一些虚假的蜘蛛欺骗,因为有一些非蜘蛛的访问也可能会具有类似蜘蛛的特征。建议使用多种方式进行判断,例如IP地址和主机名的方式同时使用,或者同时判断用户代理字符串和IP地址、主机名等。

如果对您有帮助,请给与采纳,谢谢。