高效抵御:站点的防爬与反爬虫策略解析
前些天有个朋友找过来问,说他们项目的站点中出现大量的爬虫,爬走了行业中比较敏感的附件文件该怎么办。在聊天中给出对方几点建议后,就把电脑里一些零碎的资料整理了一下,形成个小工具发给对方,也顺便copy到这里一下
反爬策略重点
1、监控:做好站点流量、访问者、访问频率频次监控,如公有云上网关节点实时监控或,网关的日志进行分析;
一些常规防爬建议:
- 用户代理检查(User-Agent Checking):
- 检测请求的User-Agent,如果是已知的爬虫代理,就拒绝或重定向请求。
- 注意:这种方法不太稳定,因为爬虫可以伪装成常见的浏览器User-Agent。
- 限制请求频率(Rate Limiting):
- 使用中间件(如Nginx的limit_req模块或者Cloudflare的Rate Limiting功能)来限制特定IP地址在给定的时间段内的请求次数。
- 为特定的端点或API路径设置更严格的限制。
验证码(CAPTCHA):
- 如果检测到连续的、快速的或者其他可疑的请求模式,可以要求用户完成一个CAPTCHA。
- 例如,可以使用reCAPTCHA、网易易盾等。
使用Cookie和JavaScript检测:
一般的爬虫可能不会执行JavaScript或保存Cookie。站点可以要求必须有某个由JavaScript生成的Cookie来访问内容。
隐藏或混淆数据:
对重要的数据进行加密或编码,只有在客户端用JavaScript解码后才能查看。
使用CSS或JavaScript将数据从其原始位置移动或改变显示方式。
检查请求头:
对HTTP请求头进行检查,如
Accept
、Referer
等,确保它们与正常的浏览器请求相匹配。
Honey Pot技巧:
在页面中加入对机器人可见但对人类用户不可见的链接或按钮。如果有请求尝试访问这些链接,那么很可能是爬虫。
使用CDN和Web应用防火墙:
例如Cloudflare或Akamai,这些服务可以帮助过滤恶意流量和爬虫请求。
常换网页结构:
通过不断改变DOM结构或类名,使得基于特定结构的爬虫不能正常工作。
监控和日志:
监控流量模式并记录日志,以便能够发现和阻止爬虫活动。
IP地址黑名单和地理位置封锁:
如果发现某些IP地址或地区的流量异常,可以考虑将其加入黑名单或限制访问。
限制并发连接数:
限制单个IP地址同时建立的连接数。
要注意的是,尽管上述策略可以帮助防止大部分爬虫,但没有任何方法可以100%地阻止所有爬虫。最好的策略是结合多种方法,并经常审查和调整策略。
针对PDF或文件的防下载
:
当用户请求PDF时,前端请求一个服务器端代理,服务器端代理再从真实路径获取PDF,并返回给前端。这样,用户和前端只知道代理的URL,而不知道真实的PDF路径。
例如:
用户请求:
https://yourdomain.com/pdf-proxy?id=12345
代理根据
id=12345
从后端或数据库查找真实的PDF路径,然后从该路径加载PDF并返回给用户。
使用数据URI方案:
服务器可以将PDF文件编码为Base64,并以数据URI的形式返回。这样前端就不需要知道PDF的真实URL,因为它直接接收到了文件的内容。
但需要注意,这种方法可能会增加响应的大小,并且不适合非常大的PDF文件。
加密或混淆URL:
可以使用加密或混淆技术使真实的PDF路径更加难以解读。尽管这不会完全隐藏真实路径,但它会使路径更难以理解或猜测。
使用一次性URL:
为每次请求生成一个临时的、一次性的URL。一旦PDF被请求并下载后,该URL将失效。这确保了即使有人得到了URL,他们也不能再次使用或与他人分享。
添加访问控制:
对于每个PDF请求,都进行身份验证和授权检查。这样即使有人得到了真实的PDF路径,他们也无法访问,除非他们有适当的权限。
用户验证:
要求用户登录才能访问PDF文件,这样可以防止匿名爬虫轻松访问。
对于敏感或重要的PDFs,可以进一步要求用户进行二次身份验证(如验证码或短信验证)。
使用robots.txt:
使用
robots.txt
文件来告诉合规的爬虫(如Googlebot)不要索引或下载PDF文件。
User-agent: * Disallow: /path-to-your-pdfs/
请求速率限制:
通过设置服务器的请求速率限制,可以限制同一IP在一定时间内的请求次数,从而防止爬虫批量下载文件。
对于Nginx,可以使用
limit_req
模块进行速率限制。
改变文件路径:
定期更改存储PDF文件的URL结构或路径。这可以打破爬虫的预期模式,使其更难批量下载文件。
监控访问模式:
通过监控工具(如日志分析工具)观察访问模式。如果发现有可疑的模式(例如,短时间内从同一IP地址连续下载多个文件),则可以考虑采取进一步的措施。
随机化URLs:
使用随机字符串作为PDF文件的URL,而不是使用连续的ID或明确的文件名。这样爬虫就不能简单地通过猜测URL来批量下载文件。
使用WAF (Web Application Firewall):
使用WAF可以帮助识别和阻止恶意的爬虫和其他形式的恶意流量。
验证码:
如果检测到用户的行为模式与常规的爬虫相似,可以要求他们输入验证码才能继续下载。
文件下载页加密:
通过JavaScript对PDF的下载链接进行加密或动态生成,使爬虫更难获取真实的下载链接。
使用内容交付网络 (CDN):
许多CDN提供商(如Cloudflare、Akamai等)提供安全功能,可以帮助对抗恶意流量和爬虫。
法律保护:
尽管这些方法可以提高PDF文件被爬虫批量下载的难度,但仍然没有办法完全阻止一个决心十足且具备技术能力的攻击者。最佳的策略是结合使用多种方法,并定期评估和更新安全策略。
Demos
一、开源级建议
基于Nginx/OpenResty的开源反爬虫方案的建议(原理性建议):
请求限制: 使用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; } } }
并发连接数限制: 使用Nginx的
limit_conn
模块来限制并发连接数。http { limit_conn_zone $binary_remote_addr zone=addr:10m; server { location / { limit_conn addr 10; } } }
使用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 } }
使用第三方模块:
: 这是一个Nginx模块,用于检测和防止大多数类型的机器人。它使用Cookie和JavaScript验证来确认请求是由真实的Web浏览器发出的。
使用WAF (Web Application Firewall):
: 一个开源、高性能、低规则维护的WAF,可以集成到Nginx中,对恶意请求进行检测和拦截。
二、产品使用建议
安全加速服务:
CDN防护: 利用其CDN服务分散攻击流量,保护原始服务器。
WAF集成: 一些云厂商的安全加速服务通常包括一个Web应用防火墙,可以识别并拦截恶意请求。
自定义规则: 根据Web应用和业务需求定制规则,例如阻止来自特定地区或IP地址段的流量。
报告和警报: 利用其报告功能来监控恶意流量模式,及时接收安全警报。
云应用防火墙 (WAF):
规则定义: 配置规则以阻止已知的攻击模式,例如SQL注入、XSS等。
实时监控: 监控所有入站和出站流量,检测任何异常行为。
自动更新: 许多WAF产品都提供了自动更新功能,可以自动获得新的已知攻击模式的定义。
虚拟补丁: 在新的安全漏洞被发现时,无需更改代码即可应用临时性的"虚拟补丁"。
某厂商的智能威胁狩猎平台:
行为分析: 通过对流量模式进行分析,识别爬虫和恶意机器人的行为。
机器学习: 利用机器学习算法持续改进检测策略,对新的攻击模式进行识别。
威胁情报: 集成外部威胁情报源,得到关于新的攻击工具、技巧和程序的信息。
沙盒分析: 对可疑文件和请求进行沙盒分析,以确定它们是否具有恶意性。
其他安全网关类产品:
网络层防护: 在网络层面上阻止恶意流量,包括DDoS攻击。
API安全: 针对API请求的特定检查,以防止API滥用。
身份验证和授权: 只允许经过验证和授权的用户和设备访问资源。
验证码服务:百度、网易、腾讯等云厂商都有类似服务。
其他……
任何反爬虫策略都应当在生产环境部署之前进行充分的测试,以确保不会误杀合法流量。而且,最佳的反爬虫策略往往是多种策略的组合使用。
发表评论