dsh-plugin-sql-security-validate:智能体 SQL 越权拦截与结构化拒答

前言

在 DeepSeek Harness(Cordis)里给智能体接数据库工具时,模型会自行拼 SQL。常见做法是事后审计或静默改写语句,前者拦不住执行,后者容易让模型误以为结果完整。下面介绍社区插件 dsh-plugin-sql-security-validate:在工具执行前用 AST 解析每条 SQL,命中策略则拒绝执行(不改写),并把 SQL_PERMISSION_DENIED 与具体被拒资源返回给模型,便于改字段、换口径或向用户说明权限不足。

这是什么

dsh-plugin-sql-security-validate 是 maintainer huangzuting 发布的 DSH 通用 AI 数据库权限管控插件,分类为 admin-security。插件 ID 为 dsh-plugin-sql-security-validate,适用 DeepSeek Harness(Cordis),仓库在 DSH 0.2.x 上验证;package.json 版本为 1.0.0-rc.1,协议 MIT。GitHub 仓库当前约 1 star。

它只拦截经已注册工具进入数据库、由 Agent 生成的 SQL,不负责 MCP 服务层、网络层或数据库账号认证,也不覆盖绕过注册工具直连库的平台路由。

核心功能

拦截与拒答,不改写

对配置范围内的工具调用,插件从指定参数键收集 SQL,经 node-sql-parser(仓库 vendor/ 内 vendored 5.4.0)做 AST 解析,汇总表、列资源后与本地(及可选远程)策略合并。任一资源被拒则调用不执行,返回结构化原因(被拒表/列、安全模式、策略来源),错误码为 SQL_PERMISSION_DENIED。

黑白名单与元数据发现

Settings → SQL 权限校验 中可选模式:

  • Blacklist(默认):除名单外均可执行;适合先跑通再补敏感表列。
  • Whitelist(配置项 securityMode: whitelist_emulate):仅名单内资源可执行,无需外部服务即可在面板维护列表。

白名单表示例:demo.user(库表)、demo.user_private.phone(单列)。README 要求写 database.table,裸表名会匹配各库同名表;可设 strictDatabaseQualification: true 收紧裸名授权。

DESCRIBE / SHOW CREATE TABLE 按表管控:允许读的表可看结构,不允许的表仍被拒。allowSchemaDiscovery 默认 true,允许无表名的 SHOW TABLES / SHOW DATABASES;表名敏感时可关闭。

工具范围与严格守卫

targetToolPrefixes 限定只检查前缀匹配的工具(MCP 工具名形如 mcp__<server>__<tool>);includeNonMcpSqlTools 可扩展至前缀外工具。sqlParamKeys 指定哪些参数键当作 SQL 解析。

可选 enableStrictGuardMode:通过 ctx.tools.guard() 做单调守卫,避免链上后续插件覆盖拒答结果。

远程策略与审计

白名单可完全离线。可选 remotePolicy 从中心服务拉策略;请求失败时 fail closed。审计默认开启,内存环形缓冲;可写 JSONL(默认 $DSH_HOME/sql-security-validate/audit.jsonl),audit.redactSql 默认不脱敏字面量。

决策流程(概要)

Agent 发出 tool call
  → 执行前 hook(或 strict 模式下的 guard)
    → 从配置的参数键收集 SQL
      → AST 解析表、列
        → 合并本地/远程策略
          → 拒答则 SQL_PERMISSION_DENIED,不执行

默认 failOnParseError: false:解析器无法识别的语句会放行;设为 true 更安全,但可能误拒部分 legacy MySQL 写法。

安装与启用

从插件市场或 GUI

在 DSH Web GUI 的 Plugin Market 或 Settings → Plugins 安装 bundle;也可在会话里让 Agent 安装本地目录,例如:

Install the bundle from C:\path\to\dsh-plugin-sql-security-validate

bundle 自带 cordis.patch.yml,会插入名为 sql-security-validate 的配置行;按 README 无需额外配置即可启动。安装后插件默认启用。

从源码

git clone <repository-url>
cd dsh-plugin-sql-security-validate
node tests/unit.mjs          # verify the checkout is intact

随后在 DSH 中将该目录作为 bundle 安装。Node 引擎要求见 package.json:^22.19.0 || >=24.0.0。

典型用法

  1. 启用插件(安装后默认已开)。
  2. 打开 Settings → SQL 权限校验。
  3. 选择 Blacklist 或 Whitelist,在 localBlacklist / localWhitelist 的 tables、columns 中维护条目。
  4. 让 Agent 使用已注册的数据库工具;每轮结束可在 turn 卡片查看当轮被拒 SQL 及命中的策略项。

生产环境可按需打开 enableStrictGuardMode、failOnParseError,关闭 allowSchemaDiscovery,并配置 audit.logPath 与 remotePolicy。

适用场景与注意

适合:ChatBI、运维问答等 Agent 经 DSH 工具执行 SQL,需要在应用层做表列级读权限、且希望模型根据明确拒因自修正的场景。

边界(README 设计说明,非缺陷):仅 registered tools;默认 schema 发现会暴露库表名;审计 SQL 默认明文;vendored 解析器需自行跟进上游安全更新(见仓库 SECURITY.md)。

安全提示:插件以当前 DSH 进程权限运行,策略再严也不能替代数据库账号与网络隔离。安装前请阅读源码与 MIT 许可证,确认 bundle 来源可信。社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系,属社区「一切皆插件」生态中的独立条目。

链接

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜