一、引言

在当今互联网时代,网站数据安全至关重要。爬虫程序虽然有其合理用途,但也可能被滥用,对网站造成性能压力、数据泄露等问题。对于用 PHP 搭建的网站来说,采取有效的防爬虫策略是非常必要的。接下来,我们就来详细探讨从基础验证到行为分析防护的一系列策略。

二、基础验证防护

1. 用户代理(User - Agent)验证

用户代理是浏览器或其他客户端软件在访问网站时发送的标识信息。我们可以通过检查用户代理来判断访问是否来自正常的浏览器。

// PHP 技术栈
// 获取用户代理信息
$user_agent = $_SERVER['HTTP_USER_AGENT'];
// 定义合法的用户代理列表
$valid_user_agents = array(
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
);
// 检查用户代理是否合法
if (!in_array($user_agent, $valid_user_agents)) {
    // 如果不合法,返回 403 禁止访问
    header('HTTP/1.1 403 Forbidden');
    exit;
}

这段代码的作用是获取访问者的用户代理信息,然后与预先定义的合法用户代理列表进行对比。如果不在列表中,就返回 403 禁止访问。

2. IP 封禁

对于频繁访问网站的 IP 地址,我们可以将其封禁。

// PHP 技术栈
// 定义封禁的 IP 列表
$blocked_ips = array('192.168.1.100', '192.168.1.101');
// 获取访问者的 IP 地址
$visitor_ip = $_SERVER['REMOTE_ADDR'];
// 检查 IP 是否被封禁
if (in_array($visitor_ip, $blocked_ips)) {
    // 如果被封禁,返回 403 禁止访问
    header('HTTP/1.1 403 Forbidden');
    exit;
}

这里我们定义了一个封禁的 IP 列表,当访问者的 IP 在这个列表中时,就禁止其访问。

三、验证码防护

验证码是一种常见的防爬虫手段,它可以区分人类用户和机器爬虫。常见的验证码有图片验证码、滑动验证码等。

1. 图片验证码

以下是一个简单的 PHP 图片验证码生成示例:

// PHP 技术栈
// 开启会话
session_start();
// 设置图片的宽度和高度
$width = 120;
$height = 40;
// 创建一个空白的图像
$image = imagecreatetruecolor($width, $height);
// 设置背景颜色
$bg_color = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bg_color);
// 生成随机验证码
$code = '';
$characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for ($i = 0; $i < 6; $i++) {
    $code .= $characters[rand(0, strlen($characters) - 1)];
}
// 将验证码存储到会话中
$_SESSION['captcha'] = $code;
// 设置文字颜色
$text_color = imagecolorallocate($image, 0, 0, 0);
// 在图像上绘制验证码
imagestring($image, 5, 20, 15, $code, $text_color);
// 输出图像
header('Content-type: image/png');
imagepng($image);
// 释放图像资源
imagedestroy($image);

在用户提交表单时,我们可以验证用户输入的验证码是否与会话中存储的验证码一致。

// PHP 技术栈
// 开启会话
session_start();
// 获取用户输入的验证码
$user_input = $_POST['captcha'];
// 获取会话中存储的验证码
$captcha = $_SESSION['captcha'];
// 验证验证码
if ($user_input != $captcha) {
    echo '验证码错误';
} else {
    echo '验证码正确';
}

四、行为分析防护

1. 访问频率分析

我们可以记录每个 IP 地址的访问频率,如果访问频率过高,就认为是爬虫行为。

// PHP 技术栈
// 获取访问者的 IP 地址
$visitor_ip = $_SERVER['REMOTE_ADDR'];
// 定义访问频率限制(每分钟最多访问 10 次)
$limit = 10;
// 获取当前时间
$current_time = time();
// 从文件中读取该 IP 的访问记录
$log_file = 'access_log.txt';
if (file_exists($log_file)) {
    $log_content = file_get_contents($log_file);
    $log_data = json_decode($log_content, true);
    if (isset($log_data[$visitor_ip])) {
        $last_visits = $log_data[$visitor_ip];
        // 移除一分钟前的访问记录
        $last_visits = array_filter($last_visits, function ($time) use ($current_time) {
            return $current_time - $time < 60;
        });
        // 检查访问次数是否超过限制
        if (count($last_visits) >= $limit) {
            header('HTTP/1.1 403 Forbidden');
            exit;
        }
        // 添加当前访问记录
        $last_visits[] = $current_time;
        $log_data[$visitor_ip] = $last_visits;
    } else {
        $log_data[$visitor_ip] = array($current_time);
    }
} else {
    $log_data = array($visitor_ip => array($current_time));
}
// 将更新后的访问记录写回文件
file_put_contents($log_file, json_encode($log_data));

这段代码通过记录每个 IP 地址的访问时间,统计一分钟内的访问次数,如果超过限制就禁止访问。

2. 页面跳转分析

爬虫通常会按照固定的模式访问页面,我们可以通过设置一些跳转规则来检测爬虫。例如,在某些页面设置一个隐藏的跳转链接,正常用户不会点击,但爬虫可能会顺着链接访问。

// PHP 技术栈
// 定义隐藏跳转页面
$hidden_page = 'hidden.php';
// 检查是否来自隐藏跳转页面
if (isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], $hidden_page) !== false) {
    header('HTTP/1.1 403 Forbidden');
    exit;
}

五、应用场景

这些防爬虫策略适用于各种类型的 PHP 网站,特别是那些包含敏感数据、商业机密或者需要保护用户信息的网站。例如,电商网站需要防止爬虫抓取商品信息,新闻网站需要防止爬虫大量复制文章内容。

六、技术优缺点

1. 基础验证防护

优点:实现简单,成本低,可以快速阻止一些简单的爬虫。 缺点:容易被绕过,例如爬虫可以伪造用户代理和 IP 地址。

2. 验证码防护

优点:可以有效区分人类用户和机器爬虫,提高网站安全性。 缺点:可能会影响用户体验,特别是对于一些视力障碍者或者老年人。

3. 行为分析防护

优点:可以更准确地检测出复杂的爬虫行为,适应性强。 缺点:需要消耗一定的服务器资源,并且可能会误判正常用户的行为。

七、注意事项

  1. 在使用 IP 封禁时,要注意不要误封正常用户的 IP 地址。可以设置一个白名单,对于一些已知的合法 IP 地址不进行封禁。
  2. 验证码的复杂度要适中,既要保证能防止爬虫,又不能给用户带来太大的困扰。
  3. 在进行行为分析时,要不断调整规则,以适应不同类型的爬虫和正常用户的行为变化。

八、文章总结

通过基础验证、验证码防护和行为分析等一系列策略,我们可以有效地保护 PHP 网站免受爬虫的侵害。每种策略都有其优缺点,我们需要根据网站的实际情况选择合适的策略,并不断优化和调整。同时,要注意在保护网站安全的同时,不影响正常用户的体验。