nginx 反爬

### 一、基于 IP 访问频率限制
1. **配置示例**:
‍‍```nginx
http {
    # 定义一个名为 anti_spider_zone 的共享内存区域,用于存储 IP 访问频率信息
    limit_req_zone $binary_remote_addr zone=anti_spider_zone:10m rate=10r/s;

    server {
        location / {
            # 对该 location 下的请求应用 IP 访问频率限制
            limit_req zone=anti_spider_zone;
            proxy_pass http://backend;
        }
    }
}
  1. 原理:通过限制每个 IP 地址在单位时间内(这里是每秒 10 次请求)的访问次数,来阻止单个 IP 进行高频请求,正常用户通常不会在短时间内发起大量请求,而爬虫可能会。当某个 IP 的请求频率超过设定值,后续请求将被延迟处理,直至其请求频率降下来。

二、基于用户代理(User-Agent)过滤

  1. 配置示例
http {
    map $http_user_agent $is_bad_ua {
        default 0;
        # 这里可以添加常见的爬虫 User-Agent 字符串进行匹配,例如:
        "~*python-requests" 1;
        "~*scrapy" 1;
    }

    server {
        location / {
            if ($is_bad_ua = 1) {
                return 403;
            }
            proxy_pass http://backend;
        }
    }
}
  1. 原理:许多爬虫会在请求头中携带特定的 User-Agent 标识。通过建立一个映射表,将常见的爬虫 User-Agent 标记为可疑,当请求的 User-Agent 匹配到这些可疑值时,直接返回 403 Forbidden 状态码,拒绝该请求。

三、基于 Referer 验证

  1. 配置示例
http {
    server {
        location / {
            # 只允许来自特定域名的 Referer
            if ($http_referer!~* ^https?://(www\.)?yourdomain\.com) {
                return 403;
            }
            proxy_pass http://backend;
        }
    }
}
  1. 原理:正常用户通过浏览器访问页面时,通常会有合理的 Referer(前一个页面的地址)。而爬虫可能没有正确设置 Referer 或者其 Referer 不符合正常的页面跳转逻辑。通过验证 Referer 是否来自合法的域名,可以过滤掉一部分异常请求。

四、验证码挑战

  1. 配置示例
http {
    server {
        location / {
            # 当某个条件触发(如 IP 访问次数达到一定阈值但未超过封禁标准)时,重定向到验证码页面
            if ($request_uri = "/captcha.html") {
                # 显示验证码页面
                root /var/www/html;
                break;
            }
            if ($bad_visitor = 1) {
                rewrite ^(.*)$ /captcha.html break;
            }
            proxy_pass http://backend;
        }
    }
}
  1. 原理:当 Nginx 根据前面的规则判断某个访问者有一定的爬虫嫌疑(如 IP 访问频率较高但未确定为恶意爬虫)时,将其重定向到一个验证码页面。只有用户成功输入验证码后,才允许继续访问后续页面,这样可以有效区分正常用户和自动化的爬虫程序,因为爬虫通常难以自动识别和输入验证码。

五、封禁恶意 IP

  1. 配置示例
http {
    geo $bad_ip {
        default 0;
        # 这里可以从一个封禁 IP 列表文件中读取要封禁的 IP,例如:
        include /etc/nginx/conf.d/bad_ips.list;
    }

    server {
        location / {
            if ($bad_ip = 1) {
                return 403;
            }
            proxy_pass http://backend;
        }
    }
}
  1. 原理:将那些被确定为恶意爬虫的 IP 地址添加到封禁列表文件中,Nginx 通过 geo​ 模块读取该列表并将对应的 IP 标记为封禁状态。当这些恶意 IP 再次发起请求时,直接返回 403 拒绝访问,从而彻底阻止它们的访问。

    在实际应用中,可以根据网站的具体需求和流量情况,灵活组合和调整这些反爬虫策略,以达到最佳的防护效果并尽量减少对正常用户体验的影响。

  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    314 引用 • 547 回帖 • 2 关注

相关帖子

1 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...