Back to skills
extension
Category: Development & EngineeringNo API key required

sql-security-checker

SQL 安全规则库,覆盖 DDL/DML 危险操作、SQL 注入检测、权限变更、敏感字段访问、性能风险、逻辑风险共 7 层安全检查。用于 Text2SQL Agent 流水线中 Agent6 的安全层校验,输入 SQL 和方言标识,输出结构化安全问题列表及统计摘要。

personAuthor: yebo111hubModelScope

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 FROMWHERE | high | 全表行删除 | | DELETE + WHERE 1=1 | high | 永真条件全删 | | UPDATEWHERE | 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, 安全规则库

状态判定规则

  • 有任一 highstatus: "fail"(阻止执行)
  • medium / lowstatus: "pass"(记录但放行)
  • 与 sql_linter 组合判定时由 Agent6 汇总两者的 issues 做最终状态判决