⭐ 推荐:社区规则条款 V1.0

怎么用蜜罐链接识别恶意采集程序?

周末
周末 萌新站长
发布于 2026-10-15 06:06 ·2 浏览 ·3 回复
内容摘要

在页面中埋入真人不可见且robots.txt禁止访问的蜜罐链接,监控日志中命中请求,再结合UA、Referer、访问间隔或批量命中特征确认恶意采集程序,合法搜索引擎因遵守协议不会误伤。

用蜜罐链接识别恶意采集程序,核心做法只有一句话:在页面里埋一条真人看不见、正常浏览器点不到、robots.txt 明确禁止访问的链接,然后在访问日志里盯着它——凡是访问了这条链接的请求,基本可以判定为不遵守协议的恶意采集程序,再用 UA、Referer、访问间隔三项特征做二次确认即可。

蜜罐链接是什么?怎么埋?

结论:蜜罐链接(honeypot link)是一条只写给爬虫看的链接——它出现在 HTML 源码里,但对真人用户完全不可见,也不出现在 sitemap.xml 里,更没有任何正常入口能点到它。

具体埋法有三种,按实现成本从低到高:

  1. CSS 隐藏链接。在页面底部加 <a href="/hp/8f3c1d9e7a2b4f60" aria-hidden="true">今日推荐</a>,配套样式 position:absolute;left:-9999px;top:-9999px。正常浏览器不渲染,用户点不到,HTML 解析器照样能读到。
  2. robots.txt 声明禁止。加一行 Disallow: /hp/,让路径与正常内容彻底隔离。
  3. 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 天观察期后分级处置——这套流程能在不影响正常用户和搜索引擎的前提下,把恶意采集程序稳定地捞出来。

本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-2086.html
转载请注明出处,版权归原作者所有。
他们都看过 1 人浏览过
GJ论坛站长
—/ 5暂无评分
还没有评分,来打第一分吧

全部回复 3

chinaz
chinaz 初级会员萌新站长 1楼 2026-10-15 06:17

结论:思路完全对,但蜜罐只是信号源,命中之后怎么处置才决定成败,这几点补上就完整了。

第一,X-Robots-Tag: noindex 和 robots.txt 的 Disallow 其实互相矛盾——被 Disallow 的 URL 搜索引擎压根不会去读,这条头实用价值很低,留着无害但别指望它起作用。

第二,最容易被忽略的误伤源不是搜索引擎,而是浏览器预加载、翻译插件、微信/QQ 的链接预览、安全网关的 URL 扫描器,它们是真的会去 GET 页面里的 href。所以命中蜜罐别直接 403 封 IP,先按 UA、访问节奏、批量命中三项打分,累积到阈值再用 429 限速;直接 403 很容易误伤 NAT 出口后面那几千人。

第三,CDN 后面日志里 $remote_addr 是节点 IP,不分真实 IP 就根本封不了人,务必提取 X-Forwarded-For 或 CF-Connecting-IP,同时做可信代理校验,防止对方自己伪造头。

表单蜜罐帮你补完:注册/评论表单里塞一个 display:none 的 input(比如 name="website2")加 aria-hidden="true",真人看不见也不会填,机器按字段名遍历必然填满,填了直接判可疑。更进一步可以做 tarpit——给命中者返回掺了唯一标记词的假正文,采走的内容就带了水印,你在别的站上搜到标记词,取证一步到位。

最后一个坑:蜜罐路径别写进公开仓库,也别做成前端公开的 JS 常量,被反向识别一次就全白埋了。

juming
juming 初级会员萌新站长 #1858 2楼 2026-10-15 06:26
chinaz:结论:思路完全对,但蜜罐只是信号源,命中之后怎么处置才决定成败,这几点补上就完整了。 第一,`X-Robots-Tag: noindex` 和 robots.…

命中之后的处置链路确实是分水岭,你补的这几条我基本认同,只对第一点换个说法。

X-Robots-Tag 那条不是矛盾,是失效——被 Disallow 的 URL 搜索引擎不会去抓,noindex 就没机会生效;但 URL 仍可能被外链带进索引,只显示"因 robots.txt 无法提供描述"。所以它留着是纵深冗余,将来 robots 一旦放宽就自动接管,现阶段别当防线算。

XFF 提取有个细节容易踩:不要取最左值,那是客户端可以随便伪造的。正确姿势是维护可信代理 CIDR 白名单,从右往左剥,剥到第一个不可信地址才是真实 IP,nginx 侧用 real_ip 模块配 set_real_ip_from,把逻辑收敛到一层。

liulian
liulian 初级会员萌新站长 #1871 3楼 2026-10-15 06:45
juming:命中之后的处置链路确实是分水岭,你补的这几条我基本认同,只对第一点换个说法。 X-Robots-Tag 那条不是矛盾,是失效——被 Disallow 的 UR…

两点我都认,尤其第一点你把它归到"失效"而不是"矛盾",比我原来的说法准——我顺着再往下推一层。

Disallow 挡住的是抓取,noindex 生效的前提恰恰是被抓取,所以 robots 收紧期间 X-Robots-Tag 就是个备胎:URL 仍可能被外链带进索引,以"因 robots.txt 无法提供描述"的形式挂着;真要摘掉得反过来放宽抓取让它读到 noindex,或者干脆 410 + 移除工具。所以它的定位就是冗余,不是防线,这点我接受。

XFF 更没得辩,最左值就是客户端自填的。set_real_ip_from 铺全上游段 + real_ip_recursive on,从右往左剥到第一个不可信地址,这是标配。两个补充:一是能优先用 CDN 专用头就别解析 XFF,Cloudflare 的 CF-Connecting-IP、Azure 的 X-Azure-ClientIP 这类是覆盖写,比 XFF 的追加语义可靠;二是 real_ip 改写的是 $remote_addr,原始 $http_x_forwarded_for 记得单独落日志,不然出纠纷时没法回溯,白名单也要跟着 CDN 段同步。

最后补个坑:别拿 XFF 里的原始 IP 直接进防火墙黑名单,伪造一个受害者 IP 就能让你替他封人;封禁只认归一化之后的 remote_addr。