高效抵御:站点的防爬与反爬虫策略解析

前些天有个朋友找过来问,说他们项目的站点中出现大量的爬虫,爬走了行业中比较敏感的附件文件该怎么办。在聊天中给出对方几点建议后,就把电脑里一些零碎的资料整理了一下,形成个小工具发给对方,也顺便copy到这里一下

高效抵御:站点的防爬与反爬虫策略解析插图

反爬策略重点

1、监控:做好站点流量、访问者、访问频率频次监控,如公有云上网关节点实时监控或,网关的日志进行分析;

2、限制:根据监控到的情况制定相关限制策略,如限制并发(同IP超出一定阈值就封禁一段时间)、增加验证、限制来源等;

一些常规防爬建议:

  1. 用户代理检查(User-Agent Checking)
  • 检测请求的User-Agent,如果是已知的爬虫代理,就拒绝或重定向请求。
  • 注意:这种方法不太稳定,因为爬虫可以伪装成常见的浏览器User-Agent。
  1. 限制请求频率(Rate Limiting)
  • 使用中间件(如Nginx的limit_req模块或者Cloudflare的Rate Limiting功能)来限制特定IP地址在给定的时间段内的请求次数。
  • 为特定的端点或API路径设置更严格的限制。
  1. 验证码(CAPTCHA)

  • 如果检测到连续的、快速的或者其他可疑的请求模式,可以要求用户完成一个CAPTCHA。
  • 例如,可以使用reCAPTCHA、网易易盾等。
  1. 使用Cookie和JavaScript检测

    • 一般的爬虫可能不会执行JavaScript或保存Cookie。站点可以要求必须有某个由JavaScript生成的Cookie来访问内容。

  2. 隐藏或混淆数据

    • 对重要的数据进行加密或编码,只有在客户端用JavaScript解码后才能查看。

    • 使用CSS或JavaScript将数据从其原始位置移动或改变显示方式。

  3. 检查请求头

    • 对HTTP请求头进行检查,如AcceptReferer等,确保它们与正常的浏览器请求相匹配。

  4. Honey Pot技巧

    • 在页面中加入对机器人可见但对人类用户不可见的链接或按钮。如果有请求尝试访问这些链接,那么很可能是爬虫。

  5. 使用CDN和Web应用防火墙

    • 例如Cloudflare或Akamai,这些服务可以帮助过滤恶意流量和爬虫请求。

  6. 常换网页结构

    • 通过不断改变DOM结构或类名,使得基于特定结构的爬虫不能正常工作。

  7. 监控和日志

    • 监控流量模式并记录日志,以便能够发现和阻止爬虫活动。

  8. IP地址黑名单和地理位置封锁

    • 如果发现某些IP地址或地区的流量异常,可以考虑将其加入黑名单或限制访问。

  9. 限制并发连接数

    • 限制单个IP地址同时建立的连接数。

要注意的是,尽管上述策略可以帮助防止大部分爬虫,但没有任何方法可以100%地阻止所有爬虫。最好的策略是结合多种方法,并经常审查和调整策略。

针对PDF或文件的防下载

  1. 使用服务器端代理:

    • 当用户请求PDF时,前端请求一个服务器端代理,服务器端代理再从真实路径获取PDF,并返回给前端。这样,用户和前端只知道代理的URL,而不知道真实的PDF路径。

    • 例如:

      • 用户请求:https://yourdomain.com/pdf-proxy?id=12345

      • 代理根据id=12345从后端或数据库查找真实的PDF路径,然后从该路径加载PDF并返回给用户。

  2. 使用数据URI方案:

    • 服务器可以将PDF文件编码为Base64,并以数据URI的形式返回。这样前端就不需要知道PDF的真实URL,因为它直接接收到了文件的内容。

    • 但需要注意,这种方法可能会增加响应的大小,并且不适合非常大的PDF文件。

  3. 加密或混淆URL:

    • 可以使用加密或混淆技术使真实的PDF路径更加难以解读。尽管这不会完全隐藏真实路径,但它会使路径更难以理解或猜测。

  4. 使用一次性URL:

    • 为每次请求生成一个临时的、一次性的URL。一旦PDF被请求并下载后,该URL将失效。这确保了即使有人得到了URL,他们也不能再次使用或与他人分享。

  5. 添加访问控制:

    • 对于每个PDF请求,都进行身份验证和授权检查。这样即使有人得到了真实的PDF路径,他们也无法访问,除非他们有适当的权限。

  6. 用户验证:

    • 要求用户登录才能访问PDF文件,这样可以防止匿名爬虫轻松访问。

    • 对于敏感或重要的PDFs,可以进一步要求用户进行二次身份验证(如验证码或短信验证)。

  7. 使用robots.txt:

    • 使用robots.txt文件来告诉合规的爬虫(如Googlebot)不要索引或下载PDF文件。

    User-agent: * 
    Disallow: /path-to-your-pdfs/

     

  8. 请求速率限制:

    • 通过设置服务器的请求速率限制,可以限制同一IP在一定时间内的请求次数,从而防止爬虫批量下载文件。

    • 对于Nginx,可以使用limit_req模块进行速率限制。

  9. 改变文件路径:

    • 定期更改存储PDF文件的URL结构或路径。这可以打破爬虫的预期模式,使其更难批量下载文件。

  10. 监控访问模式:

    • 通过监控工具(如日志分析工具)观察访问模式。如果发现有可疑的模式(例如,短时间内从同一IP地址连续下载多个文件),则可以考虑采取进一步的措施。

  11. 随机化URLs:

    • 使用随机字符串作为PDF文件的URL,而不是使用连续的ID或明确的文件名。这样爬虫就不能简单地通过猜测URL来批量下载文件。

  12. 使用WAF (Web Application Firewall):

    • 使用WAF可以帮助识别和阻止恶意的爬虫和其他形式的恶意流量。

  13. 验证码:

    • 如果检测到用户的行为模式与常规的爬虫相似,可以要求他们输入验证码才能继续下载。

  14. 文件下载页加密:

    • 通过JavaScript对PDF的下载链接进行加密或动态生成,使爬虫更难获取真实的下载链接。

  15. 使用内容交付网络 (CDN):

    • 许多CDN提供商(如Cloudflare、Akamai等)提供安全功能,可以帮助对抗恶意流量和爬虫。

  16. 法律保护:

    • 在网站的使用条款中明确规定不允许未经授权的批量下载或爬取内容,并声明违反者将受到法律追究。

尽管这些方法可以提高PDF文件被爬虫批量下载的难度,但仍然没有办法完全阻止一个决心十足且具备技术能力的攻击者。最佳的策略是结合使用多种方法,并定期评估和更新安全策略。

Demos

一、开源级建议

基于Nginx/OpenResty的开源反爬虫方案的建议(原理性建议):

  1. 请求限制: 使用Nginx的limit_req模块来进行请求速率限制。

    http {
        limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
    
        server {
            location / {
                limit_req zone=mylimit burst=20 nodelay;
            }
        }
    }

     

  2. 并发连接数限制: 使用Nginx的limit_conn模块来限制并发连接数。

    http {
        limit_conn_zone $binary_remote_addr zone=addr:10m;
    
        server {
            location / {
                limit_conn addr 10;
            }
        }
    }

     

  3. 使用OpenResty进行更复杂的反爬策略

    OpenResty是基于Nginx和Lua的Web平台,可以使用Lua进行复杂的请求处理。

    • User-Agent检查:过滤已知的爬虫User-Agent。

      location / {
          access_by_lua_block {
              local user_agent = ngx.var.http_user_agent
              if string.match(user_agent, "SomeBadBot") then
                  ngx.exit(403)
              end
          }
      }

       

    • 检查请求头:验证是否包含某些特定的请求头。

      location / {
          access_by_lua_block {
              local header_value = ngx.req.get_headers()["Some-Header"]
              if not header_value then
                  ngx.exit(403)
              end
          }
      }

       

    • 使用Cookie验证:要求请求中必须有某个Cookie。

      location / {
          access_by_lua_block {
              local cookie_value = ngx.var.cookie_mycookie
              if not cookie_value then
                  ngx.exit(403)
              end
          }
      }

       

  4. 使用第三方模块

    • Testcookie-nginx-module: 这是一个Nginx模块,用于检测和防止大多数类型的机器人。它使用Cookie和JavaScript验证来确认请求是由真实的Web浏览器发出的。

  5. 使用WAF (Web Application Firewall)

    • NAXSI: 一个开源、高性能、低规则维护的WAF,可以集成到Nginx中,对恶意请求进行检测和拦截。

二、产品使用建议

  1. 安全加速服务:

    • CDN防护: 利用其CDN服务分散攻击流量,保护原始服务器。

    • WAF集成: 一些云厂商的安全加速服务通常包括一个Web应用防火墙,可以识别并拦截恶意请求。

    • 自定义规则: 根据Web应用和业务需求定制规则,例如阻止来自特定地区或IP地址段的流量。

    • 报告和警报: 利用其报告功能来监控恶意流量模式,及时接收安全警报。

  2. 云应用防火墙 (WAF):

    • 规则定义: 配置规则以阻止已知的攻击模式,例如SQL注入、XSS等。

    • 实时监控: 监控所有入站和出站流量,检测任何异常行为。

    • 自动更新: 许多WAF产品都提供了自动更新功能,可以自动获得新的已知攻击模式的定义。

    • 虚拟补丁: 在新的安全漏洞被发现时,无需更改代码即可应用临时性的”虚拟补丁”。

  3. 某厂商的智能威胁狩猎平台:

    • 行为分析: 通过对流量模式进行分析,识别爬虫和恶意机器人的行为。

    • 机器学习: 利用机器学习算法持续改进检测策略,对新的攻击模式进行识别。

    • 威胁情报: 集成外部威胁情报源,得到关于新的攻击工具、技巧和程序的信息。

    • 沙盒分析: 对可疑文件和请求进行沙盒分析,以确定它们是否具有恶意性。

  4. 其他安全网关类产品:

    • 网络层防护: 在网络层面上阻止恶意流量,包括DDoS攻击。

    • API安全: 针对API请求的特定检查,以防止API滥用。

    • 身份验证和授权: 只允许经过验证和授权的用户和设备访问资源。

    • 验证码服务:百度、网易、腾讯等云厂商都有类似服务。

其他……

任何反爬虫策略都应当在生产环境部署之前进行充分的测试,以确保不会误杀合法流量。而且,最佳的反爬虫策略往往是多种策略的组合使用。

PS:增加一些警告机制和违法警示告诉对方你以记录,一般爬特定数据的人都是行业内的公司和团队,胆子都比较小,也担心吃官司。

发表评论