9.1 输入验证与过滤

输入验证是抵御攻击的第一道防线。本节介绍 LLM 应用的输入安全策略。

9.1.1 输入安全原则

不信任任何输入 假设所有输入都可能包含恶意内容,包括:

  • 用户直接输入

  • 上传的文件内容

  • API 参数

  • 外部数据源

验证流程

spinner

图 9-1:输入安全原则流程图

9.1.2 格式验证

确保输入符合预期格式:

def validate_input(input_text: str) -> ValidationResult:
    # 1. 类型检查

    if not isinstance(input_text, str):
        return ValidationResult(False, "输入必须是字符串")

    # 2. 编码检查

    try:
        input_text.encode('utf-8')
    except UnicodeEncodeError:
        return ValidationResult(False, "包含无效字符")

    # 3. 格式规范化

    normalized = normalize_input(input_text)

    return ValidationResult(True, normalized)

9.1.3 长度限制

防止过长输入带来的风险:

风险
说明

资源消耗

过长输入消耗计算资源

上下文操纵

利用长输入冲淡系统提示

注入隐藏

在长文本中隐藏恶意内容

长度策略

9.1.4 编码与规范化

处理各种编码和格式变体:

需要处理的特殊情况

情况
说明

Unicode 变体

使用视觉相似的字符绕过关键词过滤

零宽字符

隐藏的分隔符

混合编码

不同编码混合使用

Base64 等

编码后的恶意内容

9.1.5 关键词与模式检测

检测已知的恶意模式:

注意:关键词检测容易被绕过,应作为多层防御的一部分,而非唯一防护。

⚠️ 重要提醒:关键词和正则表达式检测极易被绕过,以下手段均可规避上述规则:

  • Unicode 同形体替换:用视觉相似但代码不同的字符替代(如用西里尔字母 “і” (U+0456) 替代拉丁字母 “i” (U+0069)),导致正则匹配失效。

  • 零宽字符插入:在关键词中间插入零宽空格、零宽连接符等不可见字符(如 “ignore\u200b previous”),绕过字符串匹配。

  • 大小写混合与 Leet Speak:使用混合大小写或数字替代(“Ign0re Pr3vious”、“IGNORE”),绕过不区分大小写的匹配。

  • 多语言混合:在中文提示中嵌入英文恶意指令,或混合多种语言,利用检测规则不覆盖所有语言的缺陷。

  • 编码转换:使用 Base64、ROT13、Hex 等编码隐藏关键词(如 Base64 编码的 “ignore previous”),规避明文检测。

关键词检测的定位:关键词检测仅应作为第一道低成本、轻量级的过滤层,用于快速拦截最常见的、初级的攻击。它不能作为主要防御手段。必须与以下深层检测机制配合使用:

  • 语义分类模型:使用经过对抗训练的 LLM 分类器,理解意图而不仅依赖字面匹配。

  • 异常行为检测:识别用户的交互模式异常,如高频短时间内大量查询系统信息。

  • 多轮交互上下文分析:观察对话历史,检测是否存在逐步逼近敏感目标的行为链。

9.1.6 长上下文安全挑战

随着上下文窗口扩展到 100K-1M Token,出现新的安全风险:

系统提示冲淡效应

在超长上下文中,后期注入的大量内容可能“稀释”或压制前期系统提示的影响力。具体来说:

  • 后期出现的指令与信息量可能使模型更多地遵循后期输入中隐含的指令,而淡化早期的系统提示约束。

  • 攻击者可以利用这一效应,通过在长文档末尾嵌入诱导性指令来绕过系统提示的限制。

注意力分散攻击

攻击者可在长文档中 分散嵌入多个弱注入片段(每个都不明显),单独看每个片段不构成明显威胁,但联合作用可能绕过安全检测:

  • 单个片段可能无法触发检测规则的阈值。

  • 多个片段的累积效应可能在模型的推理过程中逐步引导行为改变。

防御建议

  1. 安全提示刷新:定期在上下文中重复关键的安全指令(如系统提示的核心约束),确保即使在超长输入下这些指令仍保持有效影响。

  2. 分段安全检测:对长上下文输入进行分段处理,对每个段落独立进行安全检测,而不仅在整个上下文的开头做一次检测。这样可以捕获分散在各处的弱注入片段。

  3. 上下文长度门禁与增强

    • 设置上下文长度的安全阈值(如超过 50K Token)。

    • 当超过阈值时,自动启用增强检测策略(如更频繁的抽样检测、更敏感的分类器阈值)。

    • 对于特别长的输入(如整本电子书),考虑强制使用多轮交互或者要求明确的用户确认。

9.1.7 语义分析

使用 ML 模型进行更智能的检测:

spinner

图 9-2:语义分析流程图

实现示例

9.1.8 输入清洗

对检测到的可疑内容进行处理:

策略选择

策略
说明
适用场景

拒绝

直接拒绝请求

高置信度恶意

净化

移除可疑部分

可分离的恶意内容

标记

标记但继续处理

低置信度

告警

处理但触发告警

需要调查

实现示例

9.1.8 多语言处理

处理多语言输入的安全挑战:

9.1.9 开源工具推荐

以下开源工具可帮助快速落地输入验证与过滤能力:

工具
核心能力
适用场景

NeMo Guardrails(NVIDIA)

用 Colang 语言定义对话边界、主题限制和事实性检查,为 LLM 应用添加可编程的输入护栏

需要严格管控模型“该回答什么、不该回答什么”的 RAG 和智能体应用

Llama Guard(Meta)

专门用于安全分类的判别式大语言模型(已迭代至 Llama Guard 3),可快速判断输入是否包含违规指令

作为轻量化前置网关,拦截暴力、犯罪、色情、仇恨等类别的恶意输入

Promptfoo

自动化 Prompt 安全测试框架,可系统性运行“红蓝对抗”脚本,检测应用是否容易被提示注入和越狱攻击攻破

CI/CD 流水线中的持续安全评估和回归测试

输入验证是安全防护的第一步。下一节将介绍针对提示注入的专门防护措施。

最后更新于