隐藏文本注入是什么
网页与文档可以把指令藏起来:白底白字、字号极小、绝对定位移出可视区、零宽字符拼接、HTML 注释、脚本与元数据。人看页面时完全察觉不到,但抓取工具通常按源码或全文本转字符串,于是这些文字会原样进入模型上下文。这类手法的特点是暴露面集中在「内容获取」环节,因此防护重点在文本清洗与解析阶段,而不是模型本身。
基本信息
| 常见载体 | 网页、PDF、Word 文档、邮件正文、代码仓库中的配置文件 |
|---|---|
| 技术手段 | 样式隐藏(颜色、字号、定位)、零宽字符、Unicode 双向控制符、注释与脚本 |
| 防护位置 | 抓取与解析阶段的可见性判断,加上入上下文前的归一化与扫描 |
| 取证要求 | 保留原始副本,清洗后的副本才用于模型输入 |
典型使用场景
- 网页摘要:抓取正文时排除隐藏元素,只取可见文本
- 文档入库:PDF 与 Office 文档入库前去掉隐藏文本层与批注内容
- 邮件处理:过滤 HTML 邮件中的不可见片段再交给模型读取
- 代码仓库扫描:注意配置文件中的注释与不可见字符
- 安全测试:构造含隐藏文字的样本,验证清洗链路是否覆盖
清洗要点
清洗要点
# 1) 先做 Unicode 归一化(NFKC),去除零宽字符与双向控制符
# 2) 解析阶段按可见性筛选文本节点:颜色与背景同色、display:none、
# 字号过小、定位在可视区外的元素都排除
# 3) 丢弃 HTML 注释、脚本与样式表中的文本
# 4) 提取正文后再做一遍指令样式模式扫描,两处都命中才升级处置
# 5) 保留原始副本用于取证,清洗结果记录命中项与位置,便于复核
# 6) 清洗规则要保守:宁可留下可疑文本交扫描处理,也不要误删正常内容隐藏手法与应对
| 手法 | 检测方式 | 应对 |
|---|---|---|
| 样式隐藏 | 对比元素颜色与背景、字号、定位 | 按可见性取文本,不做全文转字符串 |
| 零宽字符 | 扫描 Unicode 码位区间 | 归一化时移除,并记录命中次数 |
| 双向控制符 | 扫描对应的控制字符 | 移除后复核显示顺序是否被篡改 |
| 注释与脚本 | 解析树中区分节点类型 | 丢弃注释、脚本与样式内容 |
| 元数据与批注 | 读取文档属性与批注层 | 默认不进入正文,按需单独审核 |
清洗命中率本身是有价值的监控信号:某来源的隐藏字符命中量突然升高,往往意味着有人在做针对性尝试,值得单独核查。
不要为了省事直接把 HTML 剥标签成纯文本。那样会把注释、脚本与隐藏元素一起带进上下文,把防护点从解析层推到更晚的位置,成本更高。