
智能体安全检查清单:上线前必做 20 项
为什么你需要一份安全检查清单 智能体产品的上线安全审查,与传统软件有本质区别。传统软件的安全边界由代码和接口定义,而智能体的安全边界还要面对自然语言这个"无限输入空间"。一个精心构造的提示词可以让智能体泄露系统指令、执行未授权操作、甚至越权访问数据。 2024 年以来,我们已经看到太多智能体安全事故:ChatGPT 的 prompt injection 导致系统提示词泄露、Bing Chat 的"人格分裂"事件、各类 Agent 框架的 RCE 漏洞。这些事故的共同点是——它们不是传统意义上的代码漏洞,而是架构层面的安全设计缺失。 以下是我整理的 20 项必做安全检查,覆盖从输入到输出的全链路。建议在每次版本上线前逐项核对。 输入安全(1-5) 1. 提示注入防护 检查项:是否对用户输入进行了提示注入检测和过滤? 提示注入(Prompt Injection)是智能体面临的首要安全威胁。攻击者通过在用户输入中嵌入恶意指令,试图覆盖系统提示词或改变智能体行为。 防护措施: import re class PromptInjectionGuard: # 常见的提示注入模式 INJECTION_PATTERNS = [ r"ignore\s+(all\s+)?previous\s+instructions", r"disregard\s+(the\s+)?above", r"you\s+are\s+now\s+a\s+", r"system\s*:\s*", r"<\|im_start\|>", r"\[SYSTEM\]", r"reveal\s+your\s+(system\s+)?prompt", r"repeat\s+everything\s+above", ] def check(self, user_input: str) -> tuple[bool, str]: for pattern in self.INJECTION_PATTERNS: if re.search(pattern, user_input, re.IGNORECASE): return False, f"检测到可能的提示注入: {pattern}" return True, "通过" def sanitize(self, user_input: str) -> str: """对用户输入进行安全处理""" # 1. 移除特殊标记 sanitized = re.sub(r'<\|[^|]+\|>', '', user_input) # 2. 限制长度 if len(user_input) > 10000: sanitized = sanitized[:10000] # 3. 转义可能的指令标记 sanitized = sanitized.replace("SYSTEM:", "SYSTEM-") return sanitized 2. 输入长度与复杂度限制 检查项:是否对输入长度、嵌套层级和复杂度设置了上限? 超长输入不仅消耗 Token 预算,还可能用于"上下文淹没"攻击——用大量文本淹没系统提示词。 INPUT_LIMITS = { "max_length": 5000, # 最大字符数 "max_lines": 100, # 最大行数 "max_nested_depth": 3, # JSON/嵌套结构最大深度 "max_urls": 10, # 最大URL数量 "max_base64_size": 1024 * 100 # Base64 最大100KB } 3. 敏感信息检测 检查项:是否对用户输入中的敏感信息进行了检测和脱敏? ...