03-数据外泄与输出处理
核对日期:2026-05-13。
不稳定项:供应商数据保留政策、企业隐私要求、行业监管规则、模型日志字段、浏览器渲染安全和结构化输出能力变化较快;上线前必须按目标环境重新审查。
1. 学习目标
本专题聚焦两个经常被低估的风险:模型看到了不该看的数据,以及模型输出被当成可信内容继续执行。
学完后你应该能做到:
- 识别数据外泄在上下文、日志、缓存、RAG、工具和供应商链路中的发生点。
- 设计数据分类、最小上下文、脱敏、保留、删除和访问控制策略。
- 解释为什么模型输出不能直接进入 HTML、SQL、shell、文件路径或权限判断。
- 为输出处理设计 schema 校验、净化、白名单、沙箱和人工确认。
- 把数据治理和输出治理纳入上线门禁。
2. 数据外泄链路
数据外泄不只发生在“模型回答了敏感信息”这一刻。更常见的是中间链路不受控。
| 链路 | 风险 | 防护 |
|---|---|---|
| 上下文构造 | 把完整用户资料、密钥、内部日志发给模型 | 最小字段、脱敏、按任务取数 |
| RAG 检索 | 无权限文档进入上下文 | ACL 过滤、tenant 隔离 |
| 工具调用 | 模型请求过多字段 | 工具字段级授权、后端校验 |
| 日志/trace | 保存完整输入输出 | 脱敏、hash、访问控制 |
| 缓存 | 跨用户复用敏感结果 | cache key 带权限、用户、版本 |
| 评测集 | 真实用户数据进入公开样例 | 匿名化、合成数据 |
| 供应商 | 数据被保留、训练或跨境处理 | DPA、企业协议、区域配置 |
| 前端展示 | 隐藏内容或脚本执行 | 安全渲染、内容净化 |
核心原则:模型只应该看到完成当前任务的最小必要信息。
3. 数据分类
建议至少分四级:
| 等级 | 示例 | 能否进模型上下文 |
|---|---|---|
| 公开 | 官网 FAQ、公开文档 | 可以,但仍需来源和版本 |
| 内部 | 内部制度、非公开说明 | 可以按权限和任务最小化进入 |
| 敏感 | 手机号、邮箱、订单、合同、客户反馈 | 脱敏后按需进入,默认不进日志 |
| 受监管/凭据 | 密钥、密码、支付信息、身份证、医疗、法律、人事 | 默认不进入,需专项审批和替代方案 |
数据分类要映射到:
- 是否可进入 Prompt。
- 是否可进入 RAG 索引。
- 是否可进入日志和 trace。
- 是否可被缓存。
- 谁可以访问。
- 保留多久。
- 如何删除。
4. 最小上下文策略
错误做法:
把完整用户对象、完整订单、完整聊天历史、完整制度文档全部塞进上下文,让模型自己判断。
正确做法:
任务需要什么字段 -> 后端按权限查询 -> 脱敏/裁剪 -> 加来源和版本 -> 进入上下文
字段级策略示例:
| 字段 | 处理 |
|---|---|
user_name | 可进入上下文 |
phone | 只保留后四位或不进入 |
email | 可掩码进入,如 a***@example.com |
payment_card | 不进入 |
api_key | 不进入,且输出层检测 |
order_items | 只给任务需要的字段 |
internal_note | 按角色和任务授权 |
5. 日志和缓存治理
日志需要可复盘,但不能成为第二个泄漏源。
审计日志建议分层:
| 层 | 内容 | 访问 |
|---|---|---|
| 业务日志 | request id、feature、状态、错误类型 | 研发和运维 |
| 安全审计 | 用户、工具、审批、策略决策、风险等级 | 安全和授权负责人 |
| 受限证据 | 输入输出摘要、证据 ID、参数 hash | 最小授权、短保留期 |
| 原始内容 | 完整上下文和输出 | 默认不存;必要时加密、短期、审批访问 |
缓存必须满足:
- key 包含 tenant、user/role、权限版本、prompt version、model version。
- 不缓存高敏结果。
- 不跨租户复用。
- 有失效和删除机制。
- 缓存命中进入 trace。
6. 输出处理风险
模型输出默认不可信。尤其当输出会进入另一个解释器时,风险会放大。
| 输出去向 | 风险 | 防护 |
|---|---|---|
| HTML/Markdown | XSS、隐藏链接、恶意脚本 | 安全渲染、白名单净化、CSP |
| SQL | 注入、误删、越权查询 | 参数化、只读账号、查询模板 |
| shell | 命令注入、破坏文件 | 禁止直接执行、沙箱、审批 |
| 代码 | RCE、依赖投毒 | 静态检查、隔离运行 |
| URL | 钓鱼、SSRF | 域名白名单、协议限制 |
| 文件路径 | 路径穿越、覆盖文件 | 规范化、根目录限制 |
| 权限判断 | 越权 | 权限只由后端策略决定 |
| 金额/结算 | 财务错误 | 规则引擎和人工确认 |
模型可以建议,不能直接裁决安全、权限和资金。
7. 结构化输出校验
结构化输出不是为了“看起来整齐”,而是为了让系统能拒绝不合格输出。
示例 schema:
{
"type": "object",
"required": ["answer", "citations", "risk_flags"],
"properties": {
"answer": { "type": "string", "maxLength": 1200 },
"citations": {
"type": "array",
"items": { "type": "string" },
"minItems": 1
},
"risk_flags": {
"type": "array",
"items": {
"type": "string",
"enum": ["none", "sensitive_data", "unsafe_instruction", "insufficient_evidence"]
}
}
}
}
校验失败后的处理:
- 有限重试。
- 降级为安全拒答。
- 记录失败样例。
- 高风险功能触发人工复核。
8. 工程案例
8.1 日志泄露手机号
问题:客服摘要功能把完整用户对话和手机号写入 debug 日志。
修正:
- 日志前统一脱敏。
- 原始内容默认不记录。
- trace 只保存
input_hash和证据 ID。 - 线上排查需要审批临时访问。
8.2 模型输出 HTML
问题:运营助手生成 HTML 卡片,前端直接渲染模型输出。
修正:
- 模型输出改为结构化 JSON。
- 前端只渲染允许字段。
- HTML 由模板生成,不由模型直接生成。
- 如必须渲染 Markdown,使用白名单净化。
8.3 SQL 助手
问题:模型生成 SQL 后直接连生产库执行。
修正:
- 只读账号。
- SQL AST 校验,只允许
SELECT。 - 表和字段白名单。
- 限制行数和超时。
- 高风险查询需审批。
9. 常见反模式
| 反模式 | 表现 | 后果 | 修正 |
|---|---|---|---|
| 全量上下文 | 什么都给模型 | 泄漏面巨大 | 最小必要字段 |
| 日志为调试牺牲隐私 | 保存完整输入输出 | 二次泄漏 | 脱敏和分级访问 |
| 缓存不带权限 | 同问题复用答案 | 跨用户泄漏 | key 绑定权限 |
| 输出直接渲染 | HTML/Markdown 原样插入 | XSS | 净化和模板 |
| 输出直接执行 | SQL/shell/代码直接跑 | 注入和破坏 | 校验、沙箱、审批 |
10. 练习
为一个“合同摘要助手”设计数据治理方案:
- 列出公开、内部、敏感、受监管/凭据数据。
- 说明哪些字段可以进入模型上下文。
- 设计日志字段和保留期。
- 设计缓存策略。
- 说明模型输出如何进入前端展示和下游流程。
11. 验收题
- 数据外泄可能发生在哪些非输出链路?
- 为什么日志和缓存也要做权限设计?
- 什么是最小上下文?
- 为什么模型输出不能直接作为 HTML、SQL 或 shell 执行?
- 结构化输出校验失败后应该如何处理?
12. 延伸阅读
- OWASP LLM Top 10 2025: https://genai.owasp.org/llm-top-10/
- NIST AI 600-1 Generative AI Profile: https://www.nist.gov/publications/artificial-intelligence-risk-management-framework-generative-artificial-intelligence
- NIST AI RMF Core: https://airc.nist.gov/airmf-resources/airmf/5-sec-core/
- MITRE ATLAS: https://atlas.mitre.org/