0

我将 RLS(行级安全性)与 supabase.io 一起用于“无服务器”应用程序。我必须为 RLS 策略使用各种安全定义器函数。这些仍然可以通过 supabase 的 rpc 库调用。无论如何,是否有限制调用这些函数给管理员(我)或当用作 RLS 策略的一部分时?

例如:

CREATE OR REPLACE FUNCTION get_bases_editable_or_viewable_for_user(user_id uuid, allow_edit bool)
returns setof bigint as $$
  select base_id
  from access_controls
  where access_controls.user_id = $1 AND ($2 AND access_controls.access_level = 'editor') OR access_controls.access_level = 'viewer';
$$ stable language sql security definer;

CREATE policy "Users can read bases they are editors or viewers of"
on public.bases
for select using ( bases.id in (get_bases_editable_or_viewable_for_user(auth.uid(), true)) );

get_bases_editable_or_viewable_for_user允许任何用户在拥有另一个用户的 UID 后,找出该用户作为编辑者或查看者可以访问的 UID:

supabase.rpc(
  "get_bases_editable_or_viewable_for_user",
  { user_id: "dddddde6-1111-4bdf-aaaa-33336ccc31ee", allow_edit: true }
)
.then(console.log) // => bad

最大限度地减少信息泄露的机会对于最大限度地提高应用程序的安全性和用户的隐私至关重要。

4

1 回答 1

1

您不能以这种方式限制函数的权限,因为运行查询的用户必须能够执行它。

我看到了两种改进方法:

  • 从函数中省略第一个参数,以便它只为当前用户提供结果。然后没有人可以看到其他用户的信息。

  • 除了上述之外,您还可以bases.id作为函数参数传递并让函数返回一个boolean. 然后您无法获得列表,但性能可能会受到影响,因为必须为每一行调用该函数。

于 2021-09-21T10:15:04.553 回答