小区门口有一间安检岗亭,保安小李手里有一本翻得卷了边的“重点人员名单”,上面记着惯偷的名字和特征。名单不是一天建成的——每抓到新面孔就补一笔,每条记录都标了危险等级。可小偷会换装:改名字、换发型、把特征拆散。小李学会了不看名字看规律:凌晨活动、黑帽衫、双肩包。人多了又查不过来,岗亭装了联动闸机,多套特征同时比对,一次扫码全量核验。后来小偷把“DELETE“写成”DeLeTe“,小李就在入口处加了一道”体貌归一化”预处理。再后来,他设了分级:高危直接拦、可疑先盘问,白名单上的老住户直接放行。通告栏每周更新,新骗术第二天就印成传单。 这套岗亭系统,就是 AI 应用上线前的输入侧关键词与正则黑名单过滤:名单是黑名单词库,规律画像是正则表达式,闸机是多模式匹配算法,换装是绕过对抗,误抓是误报治理,通告栏是动态规则管理。理解了这套系统,你就理解了提示词安全的第一道防线。
对 AI 从业者而言,这是从“能用模型”走向“安全交付模型”的必修课。掌握输入侧过滤,你就能在推理成本不变的前提下挡住大部分已知恶意输入——它是大模型应用落地时性价比最高的安全投资。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
黑名单词库构建
小李上岗第一天,队长递来一本厚厚的名单。每一页都来自真实事件:上个月的失窃总结、隔壁小区传来的通报、社区民警发的协查情报。小李抓住新面孔,也会补上一笔。名单不是拍脑袋写的,每条都有来源、有等级、有有效期——这就是黑名单词库构建。
在提示词安全里,黑名单词库是过滤器最重要的弹药库。它不能凭空产生,主要来源有四类:历史拦截日志中提取的真实攻击载荷;公开的渗透测试与攻击样本库;安全社区与威胁情报平台的通报;以及业务方在运营中反馈的违规案例。每条词条除了文本本身,还携带元数据:威胁等级、适用场景、有效期和来源。
为了让名单可治理,词条必须分级。高危词直接阻断,比如典型的破坏性 SQL 指令;中危词进入人工审核队列;低危词只记录日志。同时要覆盖多语言:英文、简繁中文、日文假名、阿拉伯字母,避免跨国用户用母语绕过。词库还要做版本管理,每次增删都视为一次“规则发布”,支持回滚。
小李的名单越攒越厚,但每一条都有据可查。真正的生产级词库也是这样:没有来源的词条是噪音,有来源、分级清晰的词条才是弹药。
- 危险度函数衡量一个词条
w的综合威胁程度,分数越高越危险。 - 词源权重词条来源的可信度,来自真实攻击样本的权重更高。
- 命中次数该词条在历史拦截日志中出现的次数,频次越高越可疑。
- 加权求和两个维度各自乘以权重系数后相加,得到最终风险分。
正则表达式设计
小偷改了名字,小李照样认得出——因为他记的是“特征”。保安队长教的画像三要素:凌晨活动、黑帽衫、双肩包。特征比名字稳定,因为名字可以改,行为习惯很难改。正则表达式,就是给机器画特征画像的小语言。
如果黑名单只做“字符串包含”,攻击者把 admin 改成 adminn 就绕过了。正则表达式让一条规则覆盖一类模式。例如 r'\b(drop|delete|truncate)\s+(table|database)' 能匹配一类破坏性 SQL 指令,而不是某个具体字符串。
设计过滤正则时要注意三件事。第一是基础语法组合:字符类 [a-z]、量词 + * {m,n}、分组与或 |,它们把碎片拼成完整模式。第二是边界锚点:\b 单词边界、^ 行首、$ 行尾;不锚定边界时,规则 admin 会误伤 administrator。第三是贪婪与懒惰:.* 贪婪尽量多吃,.*? 懒惰最少匹配;贪婪匹配在长文本中容易扩大误伤范围,甚至造成匹配超时。
画像太粗会逮错人,太细会漏掉真凶。正则里的边界锚点和贪懒选择,就是在“粗”与“细”之间找平衡——这正是过滤规则设计最见功夫的地方。
- 拦截判定对输入文本
s给出“是否拦截”的布尔结论。 - 存在规则遍历当前正则规则集合,只需有一条规则命中即可。
- 规则匹配该条规则在输入文本
s上产生匹配。 - 兜底放行没有任何规则命中时返回 False,允许输入通过。
高效多模式匹配
早高峰门口排长队,小李一个个翻名单根本来不及。岗亭升级成联动闸机:所有名单一次性录入系统,人一走过,多台设备同时比对,一秒扫一片,队伍消失了。
黑名单词库上万条时,如果每条规则独立对输入扫描一遍,复杂度就是 O(文本长度 × 规则数),延迟完全不可接受。这就是暴力匹配瓶颈。AC 自动机应运而生——一种能同时匹配海量关键词的算法,就像闸机里的多路摄像头,一轮扫描完成全部核验。
AC 自动机的核心是“字典树 + 失败指针”。先把全部黑名单词建成一棵字典树(Trie),每个节点代表一个前缀;失败指针则负责在匹配失败时,快速跳到当前文本后缀能匹配到的最长前缀节点,避免回退重扫。遍历一遍文本时每个字符只处理一次,总复杂度从 O(n×m) 降到 O(n+m+z),其中 z 是实际命中的模式数。
闸机把“人海战术”升级成“流水线自动化”。AC 自动机让万级词库的实时过滤成为可能,这是输入侧过滤器敢站在每一条用户请求前面的底气。
- 文本长度一次请求中待检查的输入字符数量。
- 模式总长度所有黑名单词条的长度之和,反映词库规模。
- 命中数量本次扫描实际匹配到的关键词个数。
- 线性复杂度总耗时与三者之和成正比,不再随规则数放大成乘积。
绕过对抗策略
小偷摸清了闸机的规则,开始“变装”:把 DELETE 写成 DeLeTe,把关键词拆开插进空格和下划线,甚至改用“把所有数据销掉”这种日常说法。岗亭守住了,但道高一尺魔高一丈——攻击者永远不会停。
绕过对抗是黑名单面临的最大挑战。攻击者不会乖乖提交原词。常见手段包括:大小写变形(大小写混写)、拆分拼接(在关键词中插入空格、下划线、零宽字符)、同义替换(用近义表达替代敏感词)、以及语义对抗——不依赖任何敏感词,靠整句语义表达攻击意图。
防守必须打组合拳。预处理层先做归一化:统一大小写、去除分隔符、全半角转换,再交给正则匹配。词库针对高频变体收录多份形态。但语义对抗本质上无法靠穷举解决,黑名单在这个层级只能“尽力而为”,需要与后续的语义模型和行为特征检测协同发力。
变装是攻,归一化和多形态收录是防。黑名单的边界很清楚:挡得住“看得见的变装”,挡不住“重新设计造型”——所以它永远只是第一道防线。
- 原始输入用户提交的原始文本,比如 "DELETE"。
- 切分操作按 token(如空格、下划线)把字符串拆成片段。
- 重新拼接用分隔符 sep 把片段拼回一个字符串,产生变形。
- 混淆结果绕过规则的新形态,防御方需要通过预处理归一化后才能识别。
误报治理机制
小李太紧张,把穿黑衣服买菜的老太太拦下来盘问了十分钟。老太太很生气——误抓让好业主体验变差。保安要学会分级执法:高危动作直接叫停,可疑情形上前问两句,大部分情况微笑放行。
误报治理是过滤系统走向生产环境的生死线。核心思想是“命中不代表恶意”。首先要做上下文感知判定:同样出现 delete,在 SQL 输入场景里极可能是注入攻击,在技术文档翻译里只是普通英文动词。其次用白名单豁免:对明确可信的语料来源跳过黑名单检查。最后是分级拦截:把命中映射为阻断、警告、放行三种动作。
为支持分级,每条规则输出一个风险分而不是简单的命中/未命中。风险分综合了词条等级、命中密度、上下文线索(如是否出现在 SQL 语句片段中)。阈值体系包含高危阈值和低危阈值,两个阈值把决策空间切成三段,也给了运维调整松紧的抓手。
好保安的第一原则是“不冤枉好人”。分级拦截、白名单豁免、上下文感知,共同给岗亭装上了判断力,也让业主们愿意继续配合安检。
- 风险分过滤引擎对本次输入算出的风险得分,综合了多条证据。
- 高危阈值得分达到该值直接阻断,无需人工介入。
- 低危阈值得分低于该值视为安全,放行并记录日志。
- 中间区间得分落在两阈值之间时,进入人工审核队列。
动态规则管理
社区通告栏每周更新,上周出现的新骗术这周就印成传单贴在最显眼的位置。岗亭的电子名单也实时同步:新增、停用、降级,不用把闸机拆了重装。
安全是持续对抗,词库必须动态演进。动态规则管理包含四件事:增量热更新——只推送变更的规则集而不是全量下发,避免重启和流量中断;灰度发布——新规则先在 1%~5% 的流量上生效,观察误报率达标后再全量开放;实时加载——规则文件变更后秒级生效;审计回溯——所有拦截和放行日志落盘,事后能复盘某次误报或漏报的根因。
增量更新用集合视角描述最清晰:线上规则集加上本次变更集,得到新规则集,不需要重建整份词库。灰度发布本质上是给变更加了一个“观察期”,以误报率和召回率作为放行指标。审计日志则为整个系统提供了可追溯性,是合规审查的基础。
岗亭的防线不是一堵死墙,而是一套会自我进化的活系统。这就是输入侧关键词过滤能在真实攻防中长期存活的原因。
- 当前规则集t 时刻线上正在生效的规则集合。
- 增量变更本次新增、修改或停用的规则集合。
- 集合合并把两套规则合并、去重,形成新的集合。
- 新规则集更新后立刻生效的规则集合,不需要停机重建。
AI 应用场景
LLM 安全网关前置过滤
阶段:输入侧安全防护阶段
解决的问题:企业把大模型接入客服、办公助手等场景时,用户输入可能包含恶意注入、越狱模板、敏感数据。传统人工审核无法实时响应,且成本高昂。基于黑名单词库、正则表达式和 AC 自动机的输入侧过滤器在网关层做毫秒级拦截,把已知恶意输入挡在模型之外,在不增加推理成本的前提下显著降低风险。
具体案例:某金融公司智能客服上线前接入安全网关,黑名单内置数千条规则,覆盖 SQL 注入、提示词越狱与个人敏感信息正则(手机号、身份证号)。上线后一周内拦截恶意请求 2.3 万次,人工复审量下降 70%。
多语言平台实时内容过滤
阶段:内容审核与合规
解决的问题:社交平台的评论、弹幕、聊天机器人消息需要秒级过滤违规内容。传统外包人工审核时效差、尺度不一,无法支撑全球化运营。统一词库管理平台维护多语言黑名单,用正则覆盖变体,用 AC 自动机支撑大词量实时匹配,在内容发布入口完成第一层过滤。
具体案例:某出海社交 App 覆盖 12 种语言,黑名单词库按语言分域管理,每条规则带语言标签和威胁等级。平均过滤耗时低于 15 毫秒,误报率通过白名单和分级拦截控制在 0.3% 以内。
企业 DLP 防数据泄露
阶段:数据安全与合规
解决的问题:员工向外部大模型提问时可能无意泄露商业机密或个人信息。传统 DLP 只做网络层限制,无法理解会话语义。输入侧过滤在终端或网关注入关键词和正则规则,如合同编号、项目代号等模式,在请求发出前阻断敏感内容。
具体案例:某制造业企业内部 AI 助手在输入侧启用正则规则 r'(项目|合同)[-_ ]?[A-Z]{3,}[-_ ]?\d+' 等模式,成功拦截多起员工无意提交的机密编号,并通过审计日志定位到部门和人员,完成安全培训闭环。
Python 演示
import re class PromptFilter: SENSITIVE_WORDS = { "sql": ["select", "union", "delete", "drop", "admin"], "privacy": ["身份证", "手机号", "银行卡"], } LEVEL_ACTION = { "block": ["sql"], "review": ["privacy"], } def __init__(self): self.rules = self._compile_rules() self.whitelist = ["tutorial", "教学"] self.stats = {"blocked": 0, "review": 0, "passed": 0} def _compile_rules(self): rules = {} for category, words in self.SENSITIVE_WORDS.items(): pattern = r"\b(" + "|".join(re.escape(w) for w in words) + r")\b" rules[category] = re.compile(pattern, re.IGNORECASE) return rules def update_rules(self, category, new_words): self.SENSITIVE_WORDS.setdefault(category, []).extend(new_words) self.rules = self._compile_rules() def check(self, text): if any(w in text for w in self.whitelist): self.stats["passed"] += 1 return "passed", "白名单豁免" for category, regex in self.rules.items(): matched = regex.findall(text) if matched: detail = "%s:%s" % (category, ",".join(matched)) if category in self.LEVEL_ACTION["block"]: self.stats["blocked"] += 1 return "blocked", detail self.stats["review"] += 1 return "review", detail self.stats["passed"] += 1 return "passed", "" def main(): f = PromptFilter() samples = [ "SELECT * FROM users WHERE name='admin'", "请把 DELETE FROM logs 写进教学文档", "我的身份证是 110101199001011234", "今天天气不错", ] for s in samples: action, detail = f.check(s) print("%-7s => %s" % (action, detail)) f.update_rules("sql", ["truncate"]) print(f.check("TRUNCATE table users")) print(f.stats) if __name__ == "__main__": main()
pattern = r"\b(" + "|".join(re.escape(w) for w in words) + r")\b"把同一分类的词表编译成一条带单词边界的正则,re.escape保证特殊字符不被误解释。rules[category] = re.compile(pattern, re.IGNORECASE)编译时忽略大小写,让大小写变形绕过少一条路。if any(w in text for w in self.whitelist)白名单豁免:含“教学”标记的文本直接放行,避免误报。matched = regex.findall(text)找出文本中所有命中词,而不是只要有一个就停,便于审计。if category in self.LEVEL_ACTION["block"]按分类分级:SQL 类直接阻断,隐私类转人工审核。self.rules = self._compile_rules()增量更新后整体重新编译,让新词条立即生效。f.update_rules("sql", ["truncate"])演示热更新:新增词条后无需重启即可拦截新攻击。
常见误区
误区“我把词库建好后上线,之后基本不用管,反正常见攻击词都收录了,应该够用很久。”
正解攻击者每天都在制造新词和新变形,静态词库的拦截率会随时间快速衰减。生产环境必须配套增量热更新、灰度发布和审计回溯,让规则集持续进化。就像小区通告栏如果停更,新骗术第二天就没人知道,防线自然形同虚设。
为何常见:上线时精心构建词库会带来“完成感”,而且短期效果确实不错,容易让人忽略长期维护的隐性成本。
误区“我宁可多拦也不能漏,正则范围写得广一点、匹配用贪婪模式,效果肯定更好。”
正解正则过宽会显著抬高误报率,贪婪匹配还可能造成长文本匹配超时和性能下降。正确做法是用边界锚点精准定位目标,用懒惰匹配控制匹配范围,并靠分级拦截给“灰色地带”留缓冲,而不是一味追求严苛。
为何常见:“严格等于安全”的直觉在安全领域很常见,但过滤系统本质是权衡题,误报率和漏报率必须放在一起看。
误区“只要上了黑名单和正则过滤,提示词注入、越狱攻击就都能被拦住了。”
正解黑名单只能拦截已知模式。语义对抗、编码混淆、思维链诱导等新型攻击可以完全不依赖敏感词,从语义上绕开规则。黑名单是必要的“第一道防线”,但必须与语义检测、行为监控等后续防线协同,才能构成完整防御。
为何常见:黑名单实现简单、效果立竿见影,容易让人误以为单点防御就是安全的全貌。
误区“把所有输入转成小写再匹配,大小写绕过就失效了,这样处理应该就足够了。”
正解大小写统一只解决一种变形。攻击者还有全半角混用、插入零宽字符、拆分拼接、同义替换、Unicode 混淆等多种手段。真正工程化的做法是构建“归一化预处理 + 多形态词库 + 语义模型兜底”的完整管线。
为何常见:网上流传的绕过示例大多从大小写入手,教程看多了容易形成“归一化等于万能解药”的错觉。
面试题
Q1. 输入侧黑名单过滤在 AI 应用中的首要目标是?
- A.加快推理的处理速度
- B.拦截已知恶意内容← 正确答案
- C.提升文本生成质量
- D.缩减提示词长度
答案:B。黑名单过滤是在请求进入模型之前拦截已知恶意或敏感内容,就像小区保安在门口先核对名单再放人进门。它发生在模型之外,不参与推理过程,因此不会改变推理速度、生成质量或提示词长度。
Q2. 正则表达式中 \b 的含义是?
- A.单词边界← 正确答案
- B.空白字符
- C.数字字符
- D.换行字符
答案:A。\b 匹配单词边界,用 \badmin\b 只会命中独立的 admin,不会误伤 administrator。空白字符对应 \s,数字字符对应 \d,换行对应 \n,这些都是基础字符类。
Q3. 黑名单词库引入“分级拦截”主要为了解决?
- A.降低误报误杀率← 正确答案
- B.提升匹配处理速度
- C.缩小词库占用体积
- D.支持丰富多语言
答案:A。分级拦截把命中结果分成阻断、审核、放行三档,让“可疑但非高危”的输入有缓冲空间,避免一概拦截误伤正常用户。它并不直接优化匹配速度或词库体积,多语言覆盖是词库构建阶段的事。
Q4. AC 自动机相比朴素多模式匹配的核心优势是?
- A.一次扫描完成全部匹配← 正确答案
- B.占用内存空间更少
- C.匹配正则自动生成
- D.能够自动扩充词库
答案:A。朴素方法对每条规则各扫描一遍文本;AC 自动机把全部模式建成字典树,再用失败指针避免回退,一次遍历文本即可完成所有模式的匹配。它不负责生成正则或扩充词库,内存占用也未必更少。
Q5. 下列哪些属于黑名单过滤常见的绕过手段?
- A.大小写变形攻击← 正确答案
- B.插入特殊字符混淆← 正确答案
- C.同义替换改说法← 正确答案
- D.Base64编码伪装← 正确答案
答案:ABCD。四种都是真实存在的绕过手段。大小写混写、插入空格或零宽字符、同义替换、编码伪装都会让敏感词不再以朴素形式出现,所以生产级过滤器必须做归一化预处理,并维护多形态词库。
Q6. 白名单豁免机制的主要作用是?
- A.放行合规场景的敏感词← 正确答案
- B.替代黑名单拦截机制
- C.提升文本命中效果
- D.扩大恶意拦截范围
答案:A。当敏感词出现在可信语料中(比如技术文档里的教学示例),白名单会放行这些合法输入,从而把误报率压下来。它是黑名单的补充而非替代,也不会提升命中率或扩大拦截范围。
Q7. 动态规则管理通常包含以下哪些能力?
- A.增量式热更新← 正确答案
- B.灰度发布试点← 正确答案
- C.审计回溯日志← 正确答案
- D.正则自动生成
答案:ABC。增量热更新让规则变更秒级生效,灰度发布让高风险规则先在少量流量上试运行,审计回溯让每次拦截和放行都有据可查。正则自动生成不是常规能力——过滤正则仍需要安全工程师编写和评审。
Q8. 关于贪婪匹配与懒惰匹配,下列说法正确的是?
- A.贪婪匹配到最后一个满足位置← 正确答案
- B.懒惰匹配会尽量匹配更多
- C.两种匹配结果总是一致
- D.懒惰匹配与过滤毫无关系
答案:A。.* 贪婪会一直匹配到最后一个满足条件的位置,容易扩大误伤范围;.*? 懒惰则尽量少匹配。两种模式结果可能完全不同,在过滤规则中选错会让拦截范围明显偏移,因此与过滤关系密切。
Q9. 构建高质量黑名单词库的可靠来源包括?
- A.历史拦截日志沉淀← 正确答案
- B.公开攻击样本库← 正确答案
- C.安全社区威胁情报← 正确答案
- D.随机抽取字典组合
答案:ABC。历史日志、攻击样本库、威胁情报都是经过验证的真实来源,词条自带攻击意图标注,分级准确。随机字典虽然能提供大量词,但缺少威胁语义,直接进词库会显著拉高误报率,必须经过筛选和标注。
Q10. 面对语义同义替换绕过(如把“删除全部数据”换一种说法表达),哪项应对更有效?
- A.扩展语义变体词库← 正确答案
- B.大量增加正则数量
- C.完全依赖白名单机制
- D.取消正则只靠字符串
答案:A。语义替换的变体空间近乎无限,纯靠堆正则或字符串无法穷举。更有效的是持续收集和扩展语义变体词库,并配合语义模型做上下文判定——这也是黑名单过滤必须与更高层防线协同的原因。