fix(security): 移除 SQL 注释后再进行安全验证

- 防止通过注释绕过后续的安全检查逻辑
- 增强 MySQLSecurityChecker 的防护能力
This commit is contained in:
Wenjie Zhang 2026-02-03 13:31:25 +08:00
parent f9e9fbc0b2
commit d47a66ea88
2 changed files with 19 additions and 2 deletions

View File

@ -34,8 +34,10 @@ class MySQLSecurityChecker:
if not sql: if not sql:
return False return False
# 标准化SQL # 移除SQL注释-- 和 /* */)后再验证
sql_upper = sql.strip().upper() sql_clean = re.sub(r'--.*$', '', sql, flags=re.MULTILINE)
sql_clean = re.sub(r'/\*.*?\*/', '', sql_clean)
sql_upper = sql_clean.strip().upper()
# 检查是否是允许的操作 # 检查是否是允许的操作
if not any(sql_upper.startswith(op) for op in cls.ALLOWED_OPERATIONS): if not any(sql_upper.startswith(op) for op in cls.ALLOWED_OPERATIONS):

View File

@ -12,9 +12,24 @@ from src.services.mcp_service import get_mcp_server_names, get_tools_from_all_se
from src.utils import logger from src.utils import logger
PROMPT = """你的任务是根据用户的指令,使用数据库工具和图表绘制工具,构建 SQL 查询报告。
你需要根据用户的指令生成相应的 SQL 查询并将查询结果以报表的形式返回给用户
在生成报表时你可以调用工具生成图表以更直观地展示数据
务必确保生成的 SQL 查询是正确且高效的以避免对数据库造成不必要的负担
在生成报表时请遵循以下原则
1. 理解用户的指令明确报表的需求和目标
2. 图表生成工具的返回结果不会默认渲染需要在最终的报表中以图片形式(markdown格式)嵌入
3. 必要时使用网络检索相关工具补充信息
"""
@dataclass(kw_only=True) @dataclass(kw_only=True)
class ReporterContext(BaseContext): class ReporterContext(BaseContext):
"""覆盖 BaseContext定义数据库报表助手智能体的可配置参数""" """覆盖 BaseContext定义数据库报表助手智能体的可配置参数"""
# 覆盖 system_prompt提供更具体的默认值
system_prompt: Annotated[str, {"__template_metadata__": {"kind": "prompt"}}] = field(
default=PROMPT,
metadata={"name": "系统提示词", "description": "用来描述智能体的角色和行为"},
)
mcps: Annotated[list[str], {"__template_metadata__": {"kind": "mcps"}}] = field( mcps: Annotated[list[str], {"__template_metadata__": {"kind": "mcps"}}] = field(
default_factory=lambda: ["mcp-server-chart"], default_factory=lambda: ["mcp-server-chart"],