SQL 安全与成本预言机
在查询执行之前给出裁定。
一项确定性的安全与成本检查,你的 AI 智能体在运行 SQL 之前主动调用它——并带有稳定的检测项 id,可用于为 CI 设置硬性门禁。
{
"verdict": "block",
"findings": [{
"id": "destructive.delete_without_where",
"severity": "block",
"recommendation": "Add a WHERE clause, or confirm
a full-table delete is intended."
}]
}
工作原理
被调用的那一刻,裁定即已确定。
-
01
智能体写下 SQL
你的智能体在执行任何操作之前,先通过
/mcp调用analyze_sql。 -
02
Veto 进行核验
确定性规则会对每一条语句运行。再提供一份 schema,你还能在一次性临时 Postgres 上获得一份真实的
EXPLAIN成本估算;你的生产数据库从不被触及。 -
03
裁定返回
在查询运行之前,返回带有检测项 id 的结构化
ok/warn/block裁定。
让它具备约束力。裁定在被调用的那一刻就已确定——但一个由智能体主动调用的工具,在你把它接入之前都只是建议性的。在裁定为 block 时让 CI 失败(检测项 id 是稳定的),并指示你的智能体始终先行检查。一个迫使每条语句都经过 Veto、连行为失常的智能体也无法绕过的代理,已列入路线图。
裁定
一份契约。三种状态。
SELECT … LIMIT 100
可安全运行。毫无阻碍地发布。
ALTER TABLE orders ALTER COLUMN id TYPE bigint
存在重锁风险或大规模顺序扫描。由你来决定。
DELETE FROM users
缺少防护的破坏性操作。在运行之前被拦下。
{
"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、添加可空列)会返回 ok 或 warn——只有真正的数据丢失(DROP TABLE、TRUNCATE、无防护的 DELETE/UPDATE)才会被 block。一道你真的会一直开着的护栏。
什么是自定义组织策略? +
这是一项 Pro 功能,让 Veto 从一个 linter 升级为一道治理层。内置规则对所有人都一样——它们并不知道在你的数据库里 payments 是不可侵犯的。自定义策略让你的团队添加自己的规则("绝不从 payments DELETE"、"不得对 audit_* 执行 TRUNCATE"),Veto 会在内置规则之上强制执行它们。策略是声明式数据——经过校验,从不被执行——这样安全工具本身就不会沦为一个注入漏洞。
我如何设置自定义组织策略? +
用自然语言告诉你的智能体,它就会生成声明式 JSON,并带上你的 Pro 密钥调用 set_policies 工具。策略存储在该密钥上,因此此后每一次用它发起的 analyze_sql 调用都会自动强制执行——无需网页登录,无需逐次配置。
定价
今天免费。需要更多时再升级。
- 完整的确定性裁定——每一条规则
- 破坏性、锁、正确性与成本分析(CTE 感知)
- 从不连接你的数据库
- 带稳定检测项 id 的 MCP 端点
- 60 次请求 / 分钟
- 自定义组织策略——你的规则作用于你的表,在内置规则之上强制执行。例如
no DELETE on payments。 - 1200 次请求 / 分钟——免费上限的 20 倍
- 来自维护者的直接支持
- 抢先体验,并对接下来要发布的功能拥有话语权
路线图上、由 Pro 资助的功能:审计与用量仪表盘、一个迫使每条语句都经过 Veto 的代理、嵌入式 SDK / 自托管。
订阅 Pro你的智能体不会把生产库 drop 掉。
把你的 MCP 客户端指向这个端点——数秒内即可免费使用。加上你的 Pro 密钥即可获得 1200 次请求/分钟 与自定义组织策略。
{
"mcpServers": {
"veto": { "url": "https://vetosql.com/mcp" }
}
}
任意 MCP 客户端——Claude Code、Cursor……免费版,无需密钥,60 次请求/分钟。
还没有密钥? 获取你的 Pro 密钥 →
你的密钥仅保留在你的浏览器中——不会被发送或存储。请保留 Bearer 这个词以及其后的空格。
{
"mcpServers": {
"veto": {
"type": "http",
"url": "https://vetosql.com/mcp",
"headers": { "Authorization": "Bearer VETO-…" }
}
}
}
{
"mcpServers": {
"veto": {
"url": "https://vetosql.com/mcp",
"headers": { "Authorization": "Bearer VETO-…" }
}
}
}
- 已连接——让你的智能体对
DROP TABLE test;执行analyze_sql→ 返回block就说明 Veto 已接入。 (免费版同样有效) - Pro 已生效——让它
set_policies(对payments上的delete设为 block),然后对DELETE FROM payments执行analyze_sql→ 返回policy.violation的 block 即证明你的密钥已解锁 Pro。 (免费密钥无法设置策略)
# it calls set_policies with your Pro key →
{
"policies": [
{ "table": "payments", "operations": ["delete"],
"action": "block" }
]
}
存储在你的密钥上——此后每一次 analyze_sql 都会强制执行它。无需网页登录。
系好安全带再出发