sixty

它解决什么问题

用户能看到彼此的数据

有人登录后,看到了一份不属于他的列表 —— 别人的订单、别人的消息。或者这件事还没发生,只是你刚刚想到它有可能发生 —— 而那才是读到这一页更好的时机。

为什么很难看出来

这是这类应用最严重的缺陷,也是最安静的一个。缺失的行级安全策略不会报错、不会让任何东西变慢,也不会让数据被暴露的那个人开一张工单 —— 页面是好的,对所有人都是好的,而且把所有东西都显示出来。

而且这是很容易正正当当走到的一步。行级安全在你写下第一条策略之前默认是关的;后来加的表不会自动继承策略;而一条针对你自己账号写出来的查询,在你还是唯一用户的时候,看上去完全正确。

Sixty 对此做了什么

每条查询都会被检查是否符合一个特定的形状:一张从名字看就属于某一个人的表、整条语句里任何位置都没有限定条件 —— 没有 user_id、org_id、tenant_id,也没有 auth.uid() —— 以及返回的行数多到一次单点查询解释不了。这三条必须同时成立,它才会开口。

当三条都成立时,这条发现会指出是哪条查询、哪个操作,并且请你确认,而不是宣布发生了泄露。在数据库内部生效的策略,在你的应用发出的语句里是看不见的 —— 所以它找到的是「如果 RLS 缺失,这条查询就是不安全的」,而这恰恰就是在「RLS 最可能缺失」时该去核对的那条查询。

它不做什么

它看不到你的策略,只看得到你的语句,所以它可能往安全的方向出错:一条其实被策略妥善保护的查询,仍然可能被标出来。它也不会告诉你被暴露的是谁的数据 —— 我们不收集关于你的用户的任何信息,这也正是装上它不会给你的同意横幅添任何内容的原因。

OpenTelemetry

已经在使用 OpenTelemetry?

保留当前 Collector 和 exporter。Sixty 可以接入相连链路和有用的运行时指标,推断版本回归;有原生 agent 时,还能获得更深入的函数和数据库驱动细节。

连接 OpenTelemetry Collector →

相关

看看你的上一次改动做了什么。

登录
Supabase 缺少 RLS:用户看到了别人的行 — Sixty