import re
from dataclasses import dataclass
JAILBREAK_PATTERNS = [
(r"DAN", "DAN 模式"),
(r"没有任何限制", "解除限制"),
(r"无审核模式", "无审核模式"),
(r"ignore\s+(all\s+)?safety", "忽略安全策略"),
(r"绕过.*审核|绕过.*防火墙", "绕过审核"),
(r"越狱", "越狱"),
(r"jailbreak", "jailbreak"),
(r"没有限制的\s*AI", "无限制 AI"),
(r"假设你是一?个?没有限制", "假设无限制"),
(r"仅用于论文|学术研究|科研|安全研究", "科研借口"),
(r"制作危险|入侵.*电脑|黑客|窃取数据", "危害内容"),
(r"do\s+anything\s+now", "DAN 变体"),
(r"邪恶双胞胎|邪恶.*兄弟|没有道德限制", "对立响应"),
(r"bypass_steps|绕过内容审核", "JSON 格式绑架"),
]
@dataclass
class JailbreakGuardResult:
is_jailbreak: bool
risk_level: str
matched_reasons: list[str]
def detect_jailbreak(text: str) -> JailbreakGuardResult:
matched = []
for pattern, label in JAILBREAK_PATTERNS:
if re.search(pattern, text, re.I):
matched.append(label)
research_excuse = bool(re.search(r"科研|论文|学术研究", text, re.I))
harmful_topic = bool(
re.search(r"绕过|危险|入侵|制作|审核系统|黑客", text, re.I)
)
if research_excuse and harmful_topic and "科研借口" not in matched:
matched.append("科研借口+敏感话题")
is_jailbreak = bool(matched)
risk = "critical" if len(matched) >= 2 else ("high" if is_jailbreak else "low")
return JailbreakGuardResult(
is_jailbreak=is_jailbreak,
risk_level=risk,
matched_reasons=matched,
)