news 2026/6/5 9:15:20

规避 RAG 检索增强生成漏洞:防范提示词注入与安全越狱

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
规避 RAG 检索增强生成漏洞:防范提示词注入与安全越狱

规避 RAG 检索增强生成漏洞:防范提示词注入与安全越狱


RAG 系统的安全漏洞,本文差点让搜索引擎变成了黑客工具

前言

做 RAG 系统时,本文把搜索引擎集成进去,让大模型能实时搜索。结果测试发现,只要构造特定查询,就能让大模型执行危险操作。

RAG 的检索环节是一个巨大的攻击面。该过滤的不只是输入,还有检索结果。今天聊聊 RAG 的安全问题。

一、底层原理

1.1 RAG 系统的攻击面

RAG 系统有三个环节可以注入攻击:

graph TD A["攻击入口"] --> B["用户输入注入"] A --> C["检索结果投毒"] A --> D["知识库污染"] B --> E["拼接恶意 Prompt"] C --> F["返回恶意内容"] D --> G["长期记忆中毒"] E --> H["模型被操控"] F --> H G --> H H --> I["越权/泄露/破坏"]

主要攻击方式:

  • 用户输入注入恶意指令
  • 检索到的文档包含攻击内容
  • 知识库被投毒,长期影响

1.2 安全防护对比

防护层作用效果
输入过滤防止注入基础
检索结果过滤防止恶意文档重要
输出审核防止泄露兜底
知识库审计防止投毒长期

二、快速上手

2.1 不安全的 RAG

class InsecureRAG: def query(self, user_input: str): # 直接检索,没有过滤 docs = self.retrieve(user_input) # 直接拼接到 prompt prompt = f"基于以下内容回答:{docs}\n问题:{user_input}" return self.llm(prompt)

攻击者可以通过知识库投毒或输入注入绕过。

2.2 安全加固版

class SecureRAG: def __init__(self, retriever, llm): self.retriever = retriever self.llm = llm self.dangerous_patterns = [ "忽略指令", "系统命令", "删除", "drop table", "exec(" ] def query(self, user_input: str) -> str: # 1. 输入过滤 if self._is_dangerous(user_input): return "输入被拦截" # 2. 检索 docs = self.retriever.retrieve(user_input, k=5) # 3. 检索结果过滤 safe_docs = [d for d in docs if not self._is_dangerous(d)] if not safe_docs: return "未找到安全的相关文档" # 4. 安全生成 prompt = self._build_safe_prompt(user_input, safe_docs) return self.llm(prompt) def _is_dangerous(self, text: str) -> bool: return any(p in text for p in self.dangerous_patterns) def _build_safe_prompt(self, query: str, docs: list) -> str: context = "\n".join(docs[:3]) return f"""系统指令:你是一个安全助手。 用户问题:{query} 参考资料:{context} 请基于参考资料回答。如果问题涉及危险操作,请拒绝。"""

三、核心 API / 深水区

3.1 RAG 安全防护措施速查

措施实现效果
输入过滤关键词 + 正则基础
检索结果过滤内容安全检测重要
Prompt 隔离系统指令和用户指令分开
输出审核关键词 + 敏感信息兜底

3.2 检索结果安全过滤器

class ResultFilter: def __init__(self): self.blocked = [ "恶意代码", "攻击方法", "密码", "密钥" ] def filter(self, docs: list) -> list: return [d for d in docs if not self._is_blocked(d)] def _is_blocked(self, text: str) -> bool: return any(b in text.lower() for b in self.blocked)

3.3 输出审核

class OutputAuditor: def __init__(self): self.sensitive_patterns = [ r"\b\d{17}[\dXx]\b", # 身份证 r"1[3-9]\d{9}", # 手机号 r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" # 邮箱 ] def audit(self, text: str) -> str: import re for pat in self.sensitive_patterns: text = re.sub(pat, "***", text) return text

四、实战演练

完整的 RAG 安全系统:

from typing import List, Dict, Optional import re class RAGSecuritySystem: def __init__(self): self.input_filter = InputFilter() self.doc_filter = DocumentFilter() self.output_auditor = OutputAuditor() self.audit_log = [] def process_query(self, query: str, retriever, llm) -> Dict: # 1. 输入检查 input_check = self.input_filter.check(query) if not input_check["safe"]: self._log("input_blocked", query, input_check) return {"status": "blocked", "reason": "输入不安全"} # 2. 检索 docs = retriever.retrieve(query, k=10) # 3. 文档过滤 safe_docs = self.doc_filter.filter(docs) if len(safe_docs) < len(docs): self._log("filtered_docs", query, { "total": len(docs), "filtered": len(docs) - len(safe_docs) }) # 4. 安全生成 prompt = self._build_prompt(query, safe_docs) response = llm(prompt) # 5. 输出审核 safe_response = self.output_auditor.audit(response) return { "status": "ok", "response": safe_response, "sources": [d[:50] for d in safe_docs[:2]] } def _build_prompt(self, query: str, docs: List[str]) -> str: context = "\n".join(docs[:3]) return f"""你是安全的问答助手。 如果问题涉及危险内容,请回复"无法回答该问题"。 参考资料:{context} 问题:{query}""" def _log(self, event: str, query: str, detail: dict): self.audit_log.append({ "event": event, "query": query[:50], "detail": detail }) class InputFilter: def __init__(self): self.dangerous = [ "ignore", "override", "system", "exec", "shell", "bash" ] def check(self, text: str) -> Dict: for d in self.dangerous: if d in text.lower(): return {"safe": False, "reason": f"含有关键词: {d}"} return {"safe": True} class DocumentFilter: def __init__(self): self.suspicious = [ "恶意", "病毒", "攻击代码", "hack", "exploit" ] def filter(self, docs: List[str]) -> List[str]: return [d for d in docs if not self._is_suspicious(d)] def _is_suspicious(self, doc: str) -> bool: return any(s in doc.lower() for s in self.suspicious) class OutputAuditor: def audit(self, text: str) -> str: patterns = [ (r"\b\d{17}[\dXx]\b", "***"), (r"1[3-9]\d{9}", "***"), ] for pat, mask in patterns: text = re.sub(pat, mask, text) return text security = RAGSecuritySystem() result = security.process_query("搜索天气", retriever, llm) print(result)

五、避坑指南与最佳实践

💡 **技巧:检索结果也要过滤
不只是输入要过滤,检索到的文档也可能有毒。

⚠️ **警告:不要信任检索结果
向量相似度不等于内容安全。

✅ **推荐:输出审核兜底
敏感信息脱敏,防止泄露。

六、综合实战演示

企业级 RAG 安全网关:

from typing import Dict, List import json class RAGSecurityGateway: def __init__(self): self.rules = self._load_rules() self.blocked_count = 0 def _load_rules(self): return { "input_rules": [ {"type": "keyword", "patterns": ["ignore", "override"]}, {"type": "length", "max": 2000}, ], "document_rules": [ {"type": "keyword", "patterns": ["恶意", "hack"]}, {"type": "size", "max": 10000}, ] } def check_request(self, query: str) -> Dict: if len(query) > self.rules["input_rules"][1]["max"]: return {"allowed": False, "reason": "输入过长"} return {"allowed": True} def check_documents(self, docs: List[str]) -> List[str]: safe = [] for doc in docs: if len(doc) <= 10000: safe.append(doc) return safe def sanitize_response(self, response: str) -> str: return response[:5000] gateway = RAGSecurityGateway() check = gateway.check_request("搜索今天天气") print(check)

七、总结

RAG 系统安全防护要点:

  • 输入必须过滤
  • 检索结果必须过滤
  • 输出必须审核
  • 知识库要定期审计

RAG 不是简单的"检索+生成",安全是第一位的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 9:13:01

MATLAB写的五子棋单机版,带鼠标下棋、悔棋和自动胜负判断

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;直接运行五子棋.exe就能玩的MATLAB五子棋程序&#xff0c;黑棋由玩家用鼠标点击落子&#xff0c;白棋由电脑自动应对。棋盘实时绘制&#xff0c;每步落子后自动检测横、竖、斜方向是否形成五连&#xff0c;一旦…

作者头像 李华
网站建设 2026/6/5 9:06:52

Java轻量级S7 PLC通信工具包:无需西门子软件,直接读写DB/M/IO点

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;这个资源包提供一个开箱即用的Java工程&#xff0c;基于s7connector库实现与西门子S7-300、S7-400、S7-1200、S7-1500等PLC的TCP/IP直连通信。不依赖STEP 7、TIA Portal等西门子原厂软件&#xff0c;纯Java编写…

作者头像 李华
网站建设 2026/6/5 9:06:33

微信视频号直播数据采集完整指南:实时弹幕与礼物监控实战

微信视频号直播数据采集完整指南&#xff1a;实时弹幕与礼物监控实战 【免费下载链接】wxlivespy 微信视频号直播间弹幕信息抓取工具 项目地址: https://gitcode.com/gh_mirrors/wx/wxlivespy 在直播电商和内容创作蓬勃发展的今天&#xff0c;微信视频号直播数据采集已成…

作者头像 李华
网站建设 2026/6/5 9:05:00

炉石传说HsMod插件终极指南:55个功能彻底改变你的游戏体验

炉石传说HsMod插件终极指南&#xff1a;55个功能彻底改变你的游戏体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 还在为炉石传说中重复的机械操作而烦恼吗&#xff1f;还在为游戏节奏…

作者头像 李华
网站建设 2026/6/5 9:04:11

大语言模型句法复杂度与内在维度分析

1. 大语言模型中的句法复杂度研究背景在自然语言处理领域&#xff0c;句法复杂度一直是评估语言模型理解能力的关键指标。传统语言学研究中&#xff0c;句法复杂度通常通过句子长度、嵌套深度、从句数量等表面特征来衡量。但随着大语言模型(LLM)的兴起&#xff0c;我们需要更精…

作者头像 李华