用蜜罐链接识别恶意采集程序,核心做法只有一句话:在页面里埋一条真人看不见、正常浏览器点不到、robots.txt 明确禁止访问的链接,然后在访问日志里盯着它——凡是访问了这条链接的请求,基本可以判定为不遵守协议的恶意采集程序,再用 UA、Referer、访问间隔三项特征做二次确认即可。
蜜罐链接是什么?怎么埋?
结论:蜜罐链接(honeypot link)是一条只写给爬虫看的链接——它出现在 HTML 源码里,但对真人用户完全不可见,也不出现在 sitemap.xml 里,更没有任何正常入口能点到它。
具体埋法有三种,按实现成本从低到高:
- CSS 隐藏链接。在页面底部加
<a href="/hp/8f3c1d9e7a2b4f60" aria-hidden="true">今日推荐</a>,配套样式 position:absolute;left:-9999px;top:-9999px。正常浏览器不渲染,用户点不到,HTML 解析器照样能读到。
- robots.txt 声明禁止。加一行
Disallow: /hp/,让路径与正常内容彻底隔离。
- JS 动态注入。页面加载后由脚本插入链接节点,只有执行 JavaScript 的采集器(比如 headless Chromium)才会拿到并访问,能额外识别出伪装成浏览器的爬虫。
路径里的 32 位随机 token 是关键:不同页面用不同 token,命中后就能反查是哪篇文章被采集了。
怎么判断访问者是不是恶意采集程序?
结论:命中蜜罐路径只是「可疑信号」,要坐实恶意采集,至少再满足下面三条中的两条。
- UA 与行为不符。请求头自称 Chrome/120,但没有 Accept-Language、没有 Referer,且整段会话没有请求任何 .css、.js、.jpg 静态资源。
- 访问节奏规律。同一 IP 连续请求的时间间隔标准差小于 0.2 秒——人手点击做不到这种精度。
- 批量命中。单个 IP 在 60 秒内命中 3 条以上不同蜜罐链接。
- 搜索引擎爬虫要验真。Googlebot 必须反向 DNS 解析到 googlebot.com 或 googleusercontent.com,Bingbot 解析到 search.msn.com,否则一律按伪造 UA 处理。
把这四条写成日志规则,命中蜜罐 + 满足任意两条,就进观察名单。
蜜罐链接怎么埋才不误伤正常用户和搜索引擎?
结论:用 robots.txt 明确禁止蜜罐路径,是隔开合法爬虫、只留恶意采集器最干净的做法。
原因很直接:Google、Bing 这类正规爬虫严格遵守 robots 协议,看到 Disallow: /hp/ 就不会抓;而恶意采集器追求抓取速度,绝大多数直接遍历页面里的所有 <a> 标签,根本不读 robots.txt。这样日志里访问 /hp/ 的请求,恶意占比极高。
配套还有 5 个细节:
- 蜜罐路径不要放进 sitemap.xml,也不要被站内任何正常页面链接。
- 蜜罐页返回 200 + 空内容,不要返回真实业务数据,避免被反向利用。
- 加响应头
X-Robots-Tag: noindex,防止搜索引擎万一收录。
- CDN 层对
/hp/ 设置 Cache-Control: no-store,否则命中记录会被缓存吞掉。
- 一次埋 10 到 20 条蜜罐链接就够覆盖全站主要栏目,不用遍地撒。
另外可以加表单蜜罐:注册/评论表单里放一个 display:none 的输入框,正常用户看不到不会填,自动化脚本批量填表时会填上,直接判定为机器人。
识别出来之后怎么处理?
结论:先记录、再分级处置,别一上来就封 IP。
- 观察期:把 IP、UA、时间戳、命中的 token 写入日志,静置 7 天再动手,避免误伤。
- 轻处置:返回 403,或 302 跳转到验证页。
- 资源消耗(tarpit):对确认的 IP 每次响应延迟 30 到 60 秒,拖慢对方抓取效率,注意监控自身连接数,别把并发打满。
- 封禁:按 IP 段或 ASN 封,配合 CDN 的访问规则下发。
- 防误封:企业出口 IP 和运营商 NAT 会让一个 IP 后面站着大量真人,封之前先看该 IP 的 UA 是否混杂多种浏览器版本,混杂就先降级为限速而非封禁。
总结一下:埋一条 CSS 隐藏、robots.txt 禁止、带 32 位 token 的链接,用「命中蜜罐 + UA 异常 + 间隔规律 + 批量命中」四条规则交叉验证,7 天观察期后分级处置——这套流程能在不影响正常用户和搜索引擎的前提下,把恶意采集程序稳定地捞出来。