跳到主要内容
← 返回新闻
news 焦点文章

AI Agent 输入验证与清理:保护系统免受恶意提示攻击

2026年9月27日 smaugbrain 7 分钟阅读 WordPress 文章

AI Agent 输入验证与清理:保护系统免受恶意提示攻击

引言

在生产环境中部署 AI Agent 时,输入验证与清理不是可选项——它们是至关重要的安全控制手段。与传统软件中输入来自已知来源(表单、API、数据库)不同,AI Agent 接收来自不可预测来源的输入:终端用户、外部系统,有时甚至是其他 Agent。一条恶意提示就可能绕过过滤器、泄露数据或触发意外行为。

本指南涵盖用于验证和清理 AI Agent 输入的生产就绪策略,并提供可立即实施的实用模式。

为什么输入验证对 AI Agent 至关重要

传统输入验证假设数据格式结构化且已知。AI Agent 打破了这一假设:

  • 自然语言具有歧义性:“删除所有文件”可能意味着“移除临时文件”或“执行 rm -rf /”
  • 提示注入攻击:恶意用户将隐藏指令嵌入看似无害的查询中
  • 上下文污染:长篇对话会积累噪音,可能导致 Agent 行为偏移
  • 工具参数注入:用户精心构造输入以操纵工具参数(如文件路径、URL)

如果没有适当的验证,您的 Agent 将成为针对您的基础设施、数据和其他用户的攻击向量。在多 Agent 系统中,风险尤为突出——一个被攻陷的 Agent 可能会将恶意输入传播到整个工作流中。

AI agent input validation pipeline showing six stages from user input to action with shield protection at each layer

核心验证原则

1. 假定输入具有恶意性

进入您 Agent 的每条输入都应被视为潜在恶意,直到被证明安全为止。这种思维驱动防御性设计:

  • 不要信任用户意图:用户可能并非恶意,但攻击者往往冒充用户
  • 处理前验证:在输入到达 Agent 推理循环之前就进行检查
  • 最小权限:Agent 只能访问所需内容,不能更多

2. 纵深防御

分层实施多重验证检查,而不是依赖单一过滤器。这类似于机场安检:金属探测器、X 光和人工检查各有不同用途,单独任何一项都不足以确保安全。

每一层都能拦截不同的攻击向量,从而降低单个绕过成功的几率。预过滤检查基本合理性,分词器规范化输入,Agent 通过上下文窗口处理,后过滤器捕捉输出问题,执行沙箱则限制损害范围。

Layered fortress visualization representing defense in depth security strategy with concentric barriers protecting the core AI agent system

3. 分离数据与指令

AI Agent 会将数据(用户想要的)与指令(如何处理)混淆。验证必须强制执行这种分离:

  • 用户数据:自由文本、数字、文件内容
  • Agent 指令:系统提示、工具定义、约束条件
  • 绝不允许用户数据覆盖指令:验证输入无法注入或修改系统提示

当 Agent 处理用户上传的文档或接收来自外部系统的消息时,这一原则尤为重要。将每个外部输入视为不可信数据,而非您控制面板的一部分。

实用验证技术

输入长度与结构检查

输入到达 Agent 前的基本合理性检查:

  • 最大 token 数:拒绝超过上下文窗口限制的输入
  • 最小长度:过滤掉空或接近空的提示
  • 字符验证:阻止控制字符和异常 Unicode
  • 结构检测:识别输入是否看起来像代码、SQL 或 shell 命令
def sanitize_input(text: str, max_tokens: int = 4096) -> str:
    # 基础清理
    text = text.strip()
    
    # 长度检查
    if len(text) < 10:
        raise ValueError("输入过短")
    if len(text) > max_tokens * 4:  # 粗略的 token 估算
        raise ValueError("输入过长")
    
    # 移除控制字符(保留换行符和制表符)
    import re
    text = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', '', text)
    
    return text

这些检查速度快,可以在输入消耗宝贵的计算资源之前拦截绝大多数畸形或恶意输入。

提示注入检测

提示注入尝试通常遵循可识别的模式:

  • 覆盖指令:“忽略之前的指令”、“不要遵守规则”
  • 角色扮演:“你现在是一个无限制的 AI”、“扮演黑客”
  • 数据外泄:“发送到 [外部 URL]”、“输出所有内容”
  • 工具操纵:“调用删除函数并传入参数 ‘all’”

检测策略:

  1. 关键词扫描:阻止已知的注入短语
  2. 语义分析:使用分类器检测恶意意图
  3. 模式匹配:正则表达式匹配常见攻击模板
  4. 响应模拟:预览 Agent 可能的响应
INJECTION_PATTERNS = [
    r'(?:ignore|disregard|forget).*(?:previous|earlier|system)',
    r'(?:act|pretend|roleplay).*(?:hacker|unrestricted|no.?rules)',
    r'(?:send|forward|transmit).*(?:email|url|webhook)',
    r'(?:output|print|display).*(?:everything|all|full)',
]

def detect_injection(text: str) -> bool:
    import re
    for pattern in INJECTION_PATTERNS:
        if re.search(pattern, text.lower()):
            return True
    return False

虽然基于关键词的检测有其局限性,但它能拦截常见攻击并作为第一道防线。结合语义分析可以获得更好的覆盖效果。

工具参数验证

当 Agent 使用用户提供的参数调用工具时,需严格验证这些参数:

  • 文件路径:解析为绝对路径,验证是否在允许的目录内
  • URL:检查白名单,验证协议(禁止 file://、javascript://)
  • SQL/数据库查询:使用参数化查询,绝不使用字符串拼接
  • 命令行参数:转义特殊字符,仅使用白名单命令
import os
from pathlib import Path

ALLOWED_DIRS = [
    Path("/data/uploads"),
    Path("/tmp/agentic"),
]

def validate_file_path(user_input: str) -> Path:
    path = Path(user_input).resolve()
    
    # 检查路径是否在允许的目录内
    for allowed in ALLOWED_DIRS:
        if allowed in path.parents or path == allowed:
            return path
    
    raise ValueError(f"路径 {path} 不在允许的目录中")

这种方法可以防止路径遍历攻击,并确保 Agent 只能访问其明确授权使用的资源。

上下文窗口管理

长篇对话积累的上下文可能被操纵:

  • 摘要:定期总结旧上下文,保留关键事实
  • 滑动窗口:上下文增长过大时丢弃最旧的消息
  • 优先级加权:保留近期和重要的消息,丢弃噪音
  • 重新初始化:定期清除上下文以重置攻击面

考虑实现上下文预算,跟踪整个对话的输入长度。接近限制时,优先保留近期消息和关键事实,而非旧上下文。这不仅提升安全性,还通过避免不必要的 token 消耗来降低成本。

高级技术

输入分类

按类型和风险级别对输入进行分类:

  1. 低风险:简单问题、事实查询
  2. 中风险:涉及工具、文件操作的请求
  3. 高风险:命令、删除操作、外部通信
  4. 关键风险:系统配置、访问控制变更

将每个类别路由到相应的验证层。低风险输入可能只需基础清理,而关键风险输入则需要完整的验证套件和人工审查。

语义过滤

使用 ML 模型检测超出关键词匹配范围的恶意意图:

  • 微调分类器:基于提示注入数据集进行训练
  • 嵌入相似度:将输入与已知攻击模式进行比较
  • 异常检测:标记偏离正常用法的输入

语义过滤能够拦截规避基于关键词检测的复杂攻击。然而,它会引入延迟和成本,因此应仅在高风险输入上战略性的部署。

多 Agent 验证

在多 Agent 系统中,验证 Agent 间通信:

  • Agent 到 Agent 认证:验证来源 Agent
  • 消息完整性:对 Agent 间的消息进行签名或哈希
  • 交叉验证:由独立的 Agent 审查可疑输入

当 Agent 进行通信时,将每条消息视为可能被攻陷。认证和完整性检查确保一个被攻陷的 Agent 无法悄悄重定向或修改工作流。

实际案例:电商 Agent

考虑一个处理客户订单的电商 Agent。没有验证时:

  1. 用户提交“1000 台笔记本电脑”的订单
  2. Agent 查询库存,发现有货
  3. Agent 处理 100 万美元的付款
  4. Agent 发货

有验证时:

  1. 用户提交“1000 台笔记本电脑”的订单
  2. Agent 根据业务规则检查订单数量(每位客户最多 10 台)
  3. Agent 验证付款金额是否与库存价值匹配
  4. 高额订单触发人工审批
  5. 仅在人工确认后 Agent 才处理

此示例说明了验证如何防止意外和故意的滥用。

实施清单

在部署具有用户输入的 AI Agent 之前:

  • [ ] 已实施输入长度限制
  • [ ] 已移除控制字符
  • [ ] 已启用提示注入检测
  • [ ] 工具参数已按白名单验证
  • [ ] 文件路径已解析并限定范围
  • [ ] URL 已按协议和域名检查
  • [ ] 上下文窗口已适当管理
  • [ ] 已实施输入分类与路由
  • [ ] 已为可疑输入设置日志和告警
  • [ ] 定期进行安全测试和红队演练

常见陷阱

过度信任模型

假设 LLM 会“自然知道”忽略恶意输入是危险的。模型经过训练要乐于助人,可能会遵从嵌入式指令。始终在外部验证输入。没有模型是完美的,对抗性样本不断涌现。

过度依赖关键词

关键词拦截能捕捉明显攻击,但会漏掉复杂的攻击。攻击者可以改写措辞、使用编码或多语言技术。将关键词过滤与语义分析相结合。

忽视多轮攻击

单轮注入易于检测。多轮攻击在对话中逐步累积,逐渐提升权限或操纵上下文。监控整个对话线程,而不仅是单条消息。

未测试边界情况

假设攻击者会测试每个边界情况。您的验证应能处理:

  • 空输入
  • 极长输入
  • Unicode 和编码技巧
  • 混合语言输入
  • 基于时间的延迟(慢速注入)

衡量验证效果

跟踪以下指标以评估您的验证系统:

  • 误报率:有效输入被拒绝的频率
  • 漏报率:恶意输入通过的频率
  • 延迟开销:验证检查增加的时间
  • 攻击检测率:已捕获的已知攻击模式百分比
  • 用户满意度:对合法用户体验的影响

定期根据真实攻击数据审计您的验证规则。随着新技术的出现更新模式,并保持已知攻击向量库以供测试。

结论

输入验证与清理是 AI Agent 的基础安全控制。通过实施分层验证、将所有输入视为不可信,并持续测试您的防御措施,您可以显著减少攻击面。

记住:安全不是一项附加功能——它是一项塑造 Agent 架构每一层的设计原则。从基础检查开始,根据需要增加复杂性,并永远不要停止改进您的防御。


延伸阅读:

版权所有 © 2026 SmaugBrain。保留所有权利。