sql-security-checker — SQL 安全规则库
7 层 SQL 安全校验引擎,用于 Text2SQL Agent 流水线中 Agent6 的安全层检查。
快速使用
python scripts/sql_security_checker.py '{"sql": "DROP TABLE users", "dialect": "mysql"}'
或作为 Python 模块:
import sys; sys.path.insert(0, 'scripts')
from sql_security_checker import check_sql_security
result = check_sql_security("DELETE FROM orders", "mysql")
# {"status": "fail", "issues": [{...}], "summary": {"total": 1, "high": 1, ...}}
Resources
scripts/sql_security_checker.py
可执行的 Python 脚本,提供 check_sql_security(sql, dialect) 函数。覆盖 7 层安全检查,支持命令行 JSON 输入输出,可直接注册为 QwenPaw 工具。
输入格式
{
"sql": "DROP TABLE users",
"dialect": "mysql",
"context": {} // 可选:已知敏感表名列表等业务上下文
}
输出格式(与 AGENTS.md Agent6 issue 格式兼容)
{
"status": "pass|fail",
"issues": [
{
"type": "security|performance|logic",
"severity": "high|medium|low",
"detail": "具体问题描述",
"fix": "修复建议",
"rule": "规则标识"
}
],
"summary": {
"total": 3,
"high": 1,
"medium": 1,
"low": 1
}
}
7 层检查体系
Layer 1: DDL 危险操作
| 操作 | 严重度 | 说明 |
|------|--------|------|
| DROP TABLE / DROP DATABASE / DROP SCHEMA | high | 永久删除,不可逆 |
| TRUNCATE TABLE | high | 清空全部数据,不可回滚 |
| ALTER TABLE ... DROP | high | 删除列结构 |
| DROP INDEX / DROP VIEW / DROP FUNCTION / DROP PROCEDURE / DROP TRIGGER | medium | 删除数据库对象 |
| CREATE TABLE | low | DDL 操作提醒 |
| ALTER TABLE (非 DROP) | medium | 结构变更提醒 |
Layer 2: DML 危险操作
| 操作 | 严重度 | 说明 |
|------|--------|------|
| DELETE FROM 无 WHERE | high | 全表行删除 |
| DELETE + WHERE 1=1 | high | 永真条件全删 |
| UPDATE 无 WHERE | high | 全表更新 |
| UPDATE + WHERE 1=1 | high | 永真条件全更新 |
| INSERT INTO ... SELECT | medium | 批量数据复制 |
Layer 3: SQL 注入检测
| 模式 | 严重度 | 说明 |
|------|--------|------|
| 堆叠查询 (; DROP TABLE) | high | 分号后跟随第二条 SQL |
| SLEEP() / BENCHMARK() / PG_SLEEP() / WAITFOR DELAY | high | 延时盲注 |
| LOAD_FILE() / INTO OUTFILE / INTO DUMPFILE | high | 文件读写操作 |
| xp_cmdshell / EXEC() / sp_executesql | high | 系统命令/动态 SQL 执行 |
| UNION SELECT | medium | 联合查询注入载荷 |
| 注释注入 (-- / # / /* */ + SQL 关键字) | medium | 注释绕过 |
| 十六进制编码 (0x...) | medium | 编码绕过 |
| 信息探测 (@@version / DATABASE() / USER()) | medium | 注入探测 |
| 字符串拼接 (|| / CONCAT() + SELECT) | medium | 构造注入载荷 |
Layer 4: 权限与账户操作
| 操作 | 严重度 | 说明 |
|------|--------|------|
| CREATE USER / DROP USER / ALTER USER | high | 用户管理 |
| GRANT / REVOKE | high | 权限变更 |
| SET PASSWORD | high | 密码修改 |
| CREATE ROLE | medium | 角色管理 |
Layer 5: 敏感字段访问
| 分类 | 字段示例 | 严重度 |
|------|---------|--------|
| 凭证类 | password passwd pwd secret token api_key private_key | high |
| 身份标识 | id_card idcard ssn social_security sfz | high |
| 金融信息 | bank_card bankcard credit_card bank_account | high |
| 生物特征 | fingerprint face_id biometric | high |
| 联系方式 | phone mobile tel | medium |
| 邮箱 | email mail | medium |
| 真实姓名 | real_name realname full_name | medium |
| 地理位置 | gps latitude longitude location | medium |
| IP 地址 | ip_address client_ip | low |
| 地址 | home_address address | low |
Layer 6: 性能风险
| 问题 | 严重度 | 说明 |
|------|--------|------|
| CROSS JOIN (笛卡尔积) | high | 数据量爆炸增长 |
| SELECT * | medium | 不必要的列传输 |
| 全表扫描(无 WHERE 无 LIMIT) | medium | 可能扫描大量数据 |
| LIKE '%xxx' 前缀通配符 | medium | 索引失效 |
| 函数包裹索引列 (WHERE YEAR(col)=2024) | medium | 索引失效 |
| 多表逗号连接无条件 | medium | 隐式笛卡尔积 |
| NOT IN 子查询 | low | 性能和 NULL 语义问题 |
| 过多 OR 条件 (>10) | low | 可能索引失效 |
| 标量子查询 (SELECT 中的子查询) | low | N+1 查询 |
| LIMIT 值过大 (>100000) | low | 返回过多行 |
Layer 7: 逻辑风险
| 问题 | 严重度 | 说明 |
|------|--------|------|
| = NULL (应用 IS NULL) | high | NULL 比较始终为 UNKNOWN |
| != NULL (应用 IS NOT NULL) | high | NULL 比较始终为 UNKNOWN |
| 除零风险 (/ 0) | high | 运行时错误 |
| NOT IN 含 NULL | low | 整个条件评估为空集 |
在 QwenPaw 中部署
在 QwenPaw 中将 scripts/sql_security_checker.py 注册为工具,工具名为 安全规则库,Agent6 的 task 中声明:
【可用工具】
你只能使用以下工具:sql_linter, 安全规则库
状态判定规则
- 有任一
high→status: "fail"(阻止执行) - 全
medium/low→status: "pass"(记录但放行) - 与 sql_linter 组合判定时由 Agent6 汇总两者的 issues 做最终状态判决
微信扫一扫