SQL 安全与成本预言机

在查询执行之前给出裁定。

一项确定性的安全与成本检查,你的 AI 智能体在运行 SQL 之前主动调用它——并带有稳定的检测项 id,可用于为 CI 设置硬性门禁。

确定性 流程中没有 LLM 从不连接你的数据库
analyze_sql
# 你的智能体写下了:
DELETE FROM users;
● block
{
  "verdict": "block",
  "findings": [{
    "id": "destructive.delete_without_where",
    "severity": "block",
    "recommendation": "Add a WHERE clause, or confirm
                       a full-table delete is intended."
  }]
}
协同运转于 Claude Code Cursor Postgres MCP GitHub CI

工作原理

被调用的那一刻,裁定即已确定。

  1. 01

    智能体写下 SQL

    你的智能体在执行任何操作之前,先通过 /mcp 调用 analyze_sql

  2. 02

    Veto 进行核验

    确定性规则会对每一条语句运行。再提供一份 schema,你还能在一次性临时 Postgres 上获得一份真实的 EXPLAIN 成本估算;你的生产数据库从不被触及。

  3. 03

    裁定返回

    在查询运行之前,返回带有检测项 id 的结构化 ok / warn / block 裁定。

让它具备约束力。裁定在被调用的那一刻就已确定——但一个由智能体主动调用的工具,在你把它接入之前都只是建议性的。在裁定为 block 时让 CI 失败(检测项 id 是稳定的),并指示你的智能体始终先行检查。一个迫使每条语句都经过 Veto、连行为失常的智能体也无法绕过的代理,已列入路线图。

裁定

一份契约。三种状态。

● ok
SELECT … LIMIT 100

可安全运行。毫无阻碍地发布。

● warn
ALTER TABLE orders ALTER COLUMN id TYPE bigint

存在重锁风险或大规模顺序扫描。由你来决定。

● block
DELETE FROM users

缺少防护的破坏性操作。在运行之前被拦下。

演示

它拦下了这次迁移。你从此不必再写事故复盘。

相同的输入,相同的裁定——每一次都如此。带有稳定 id 的确定性检测项,可用于为 CI 设置门禁。

通过 MCP 接入
analyze_sql · response
# DROP TABLE invoices;
● block
{
  "verdict": "block",
  "findings": [{
    "id": "destructive.drop",
    "severity": "block",
    "recommendation": "Confirm the object is unused;
                       consider renaming first as a
                       safer rollback path."
  }]
}

为何选择 Veto

那一层值得你押注的、平淡而可靠的存在。

  • 确定性

    相同的语句,相同的裁定——每一次都如此。没有模型漂移,完全可复现。

  • 流程中没有 LLM

    靠的是规则 + 查询计划,而非提示词。没有 token,没有延迟,也没有凭空臆造的批准。

  • 从不触及你的数据库

    成本估算通过 BEGIN … ROLLBACK 在临时 Postgres 上运行。生产环境从不被连接。

  • 以黄金评测为门禁

    CI 中稳定的检测项 id 与黄金用例——一份你可以长期信赖的契约。

常见问题

为你一一解答。

Veto 会连接我的数据库吗? +

不会。Veto 从不连接你的生产数据库。成本与计划估算在一次性临时 Postgres 上运行,置于一个始终会回滚的事务之中。

是否由某个 LLM 来做决定? +

不是。裁定由确定性规则和查询计划分析产生——而非模型。相同的输入永远得出相同的裁定。

我的智能体如何调用它? +

/mcp 通过 MCP 接入,并暴露 analyze_sql 工具。你的智能体在运行任何语句之前都先请求一份裁定。

Veto 是硬性门禁,还是建议性的? +

两者皆可——取决于你如何接入它,而我们更愿意把这点讲清楚。裁定本身是确定性的:相同的 SQL 永远返回相同的 ok / warn / block,回路中没有模型。默认情况下,你的智能体调用 analyze_sql 并自行决定如何处理这个答案,所以它是建议性的——一张确定性的安全网,而不是横亘在数据路径上的内核级拦截器。要让它具备约束力:用稳定的检测项 id 为 CI 设置门禁(在 block 时让构建失败),并指示你的智能体始终先行检查。一个迫使每条语句都经过 Veto、连行为失常的智能体也无法绕过的代理,已列入路线图。Veto 的约束力,恰好等于你把它放进的那一步所具备的约束力。

哪些内容会离开我的机器?你们又会存储什么? +

你的 SQL——以及你为成本分析提供的 schema DDL(如果有的话)——会通过 TLS 发送到托管端点,在内存中完成分析,随后被丢弃。我们只持久化分析用的元数据:裁定、触发了哪些规则 id、是否提供了 schema,以及延迟。绝不存储你的 SQL、你的 schema 或你的表名。彻底消除数据外发的自托管方案,已列入路线图。

它覆盖哪些范围? +

破坏性语句(无限定范围的 DELETE/UPDATE、DDL drop、隐藏在 CTE 中的语句)、正确性陷阱(NULL 比较,如 = NULL、带子查询的 NOT IN、悄然退化为内连接的 LEFT JOIN),以及成本风险(大规模顺序扫描、缺失索引)。覆盖范围有意做得窄而可靠,而非广而模糊。

它会误拦我的常规迁移吗? +

不会。这些规则就是纯粹的 Postgres——适用于任何数据库(Supabase、Neon、RDS、自托管)和任何迁移工具。基于真实世界的迁移调校:常规的 DROP POLICY / DROP INDEX / DROP FUNCTION 以及轻锁的 ALTER(启用 RLS、添加可空列)会返回 okwarn——只有真正的数据丢失(DROP TABLETRUNCATE、无防护的 DELETE/UPDATE)才会被 block。一道你真的会一直开着的护栏。

什么是自定义组织策略? +

这是一项 Pro 功能,让 Veto 从一个 linter 升级为一道治理层。内置规则对所有人都一样——它们并不知道在你的数据库里 payments 是不可侵犯的。自定义策略让你的团队添加自己的规则("绝不从 payments DELETE"、"不得对 audit_* 执行 TRUNCATE"),Veto 会在内置规则之上强制执行它们。策略是声明式数据——经过校验,从不被执行——这样安全工具本身就不会沦为一个注入漏洞。

我如何设置自定义组织策略? +

用自然语言告诉你的智能体,它就会生成声明式 JSON,并带上你的 Pro 密钥调用 set_policies 工具。策略存储在该密钥上,因此此后每一次用它发起的 analyze_sql 调用都会自动强制执行——无需网页登录,无需逐次配置。

定价

今天免费。需要更多时再升级。

免费版 €0
  • 完整的确定性裁定——每一条规则
  • 破坏性、锁、正确性与成本分析(CTE 感知)
  • 从不连接你的数据库
  • 带稳定检测项 id 的 MCP 端点
  • 60 次请求 / 分钟
Pro €9.90/月
  • 自定义组织策略——你的规则作用于你的表,在内置规则之上强制执行。例如 no DELETE on payments
  • 1200 次请求 / 分钟——免费上限的 20 倍
  • 来自维护者的直接支持
  • 抢先体验,并对接下来要发布的功能拥有话语权

路线图上、由 Pro 资助的功能:审计与用量仪表盘、一个迫使每条语句都经过 Veto 的代理、嵌入式 SDK / 自托管。

订阅 Pro

你的智能体不会把生产库 drop 掉。

把你的 MCP 客户端指向这个端点——数秒内即可免费使用。加上你的 Pro 密钥即可获得 1200 次请求/分钟 与自定义组织策略。

.mcp.json
{
  "mcpServers": {
    "veto": { "url": "https://vetosql.com/mcp" }
  }
}

任意 MCP 客户端——Claude Code、Cursor……免费版,无需密钥,60 次请求/分钟

还没有密钥? 获取你的 Pro 密钥 →

你的密钥仅保留在你的浏览器中——不会被发送或存储。请保留 Bearer 这个词以及其后的空格。

Claude Code · .mcp.json
{
  "mcpServers": {
    "veto": {
      "type": "http",
      "url": "https://vetosql.com/mcp",
      "headers": { "Authorization": "Bearer VETO-…" }
    }
  }
}
Cursor · ~/.cursor/mcp.json
{
  "mcpServers": {
    "veto": {
      "url": "https://vetosql.com/mcp",
      "headers": { "Authorization": "Bearer VETO-…" }
    }
  }
}
  1. 已连接——让你的智能体对 DROP TABLE test; 执行 analyze_sql → 返回 block 就说明 Veto 已接入。 (免费版同样有效)
  2. Pro 已生效——让它 set_policies(对 payments 上的 delete 设为 block),然后对 DELETE FROM payments 执行 analyze_sql → 返回 policy.violation 的 block 即证明你的密钥已解锁 Pro。 (免费密钥无法设置策略)
set_policies · Pro
# 用自然语言告诉你的智能体:
"never let anything DELETE from payments"
# it calls set_policies with your Pro key →
{
  "policies": [
    { "table": "payments", "operations": ["delete"],
      "action": "block" }
  ]
}

存储在你的密钥上——此后每一次 analyze_sql 都会强制执行它。无需网页登录。

系好安全带再出发