我试图理解将 PostgreSQL 函数标记为 LEAKPROOF 的含义。假设我们有一个(单租户)Web 应用程序设置,即浏览器 -> 服务器(Django、Rails 等) -> PostgreSQL。服务器是唯一可以访问 PostgreSQL 的服务器,也是唯一可以添加运行查询、执行函数等的服务器。
服务器尝试查询公共模式中名为 的表foo
。该表只是一个主键id
和一个jsonb
字段 ,bar
包含 100,000 行。该jsonb
字段上有一个 GIN 索引。当未应用行级安全性时,任何使用 GIN 索引->
的查询都可以。bar
但是,当应用行级安全性时,行级安全性会强制进行顺序扫描。这是一个已知的“问题”,如此处、此处等所述。
在阅读了 PostgreSQL 文档和大量帖子后,我很难看到jsonb
用 LEAKPROOF 等效项覆盖过滤器操作的风险。我知道文档说它可能“泄漏”信息,但在单个租户设置中,它会将信息泄漏给谁?服务器可以过滤掉发送给客户端的任何错误消息,并且服务器本身是受信任的实体。
如果函数对不允许用户访问的数据进行操作,则该函数可能会将信息泄漏给调用它的用户。该泄漏可能是一条错误消息:“我收到除零错误,因此某处一定有零。” 现在
->
不会给你这个错误,但是你能证明聪明的用户无法让它泄漏有关它正在操作的 JSON 的信息吗?如果您的服务器和应用程序完全安全,则不需要任何额外的安全性。因此,最好不要使用行级安全性,而
WHERE
应在适当的情况下使用显式条件。我钦佩您对您的申请完美的信任。如果你想要安全,就必须为安全付出代价。使用行级安全性等安全功能,然后通过标记随机函数来解除它,这
LEAKPROOF
是一种愚蠢的做法。