Veto 对比 QueryShield
QueryShield 作为安全 SQL 代理位于 AI 智能体与数据库之间:通过 Claude 将自然语言转为 SQL、AST 级校验(仅限 SELECT,不允许 DDL/DML)、按智能体的行级安全,以及审计日志。Veto 不做转换也不执行——它对智能体已经产出的 SQL 返回确定性裁定。
一览
| QueryShield | Veto | |
|---|---|---|
| 架构 | 代理——智能体与 QueryShield 通信,由它与 Postgres 通信 | 边车门禁——智能体调用 analyze_sql,然后自行执行 SQL |
| 自然语言 → SQL | 是(Claude) | 否——审查原样写好的 SQL/迁移 |
| 允许的操作 | 按策略仅限 SELECT;在 AST 处拦截 DDL/DML | 分析所有 Postgres 语句;破坏性语句 → block |
| 行级安全 | 按智能体强制执行 RLS | 非代理——使用 Postgres RLS + Veto 裁定层 |
| 接触你的数据库 | 是——执行通过校验的查询 | 从不——仅在临时 Postgres 上做 EXPLAIN |
| 核心中含 LLM | 是——用于自然语言转换 | 否——仅确定性规则 |
何时适合 QueryShield
你希望智能体用自然语言提问并获得只读答案,由代理强制执行仅限 SELECT 的访问和租户隔离。执行与审计都在代理内部发生。
何时适合 Veto
你的智能体已经在编写 SQL 或迁移(包括你打算允许的写入),而你需要一道确定性的预检——"这条 DELETE 安全吗?"——而无需把所有流量都路由到代理。Veto 属于护栏品类,而非数据库访问层。
不同的品类
QueryShield 与 Veto 并非直接替代关系。QueryShield 控制智能体如何访问数据。Veto 判定某条具体语句是否应当执行。当智能体确有需要运行迁移时,只读代理帮不上忙——Veto 仍会标记一个无防护的 TRUNCATE。