数据库

强化数据API安全性


您的数据库自动生成的 Data API 默认会公开 public 模式。如果您的 public 模式被其他工具作为默认空间使用,您可能需要锁定该模式。这有助于防止自动添加到 public 的数据被意外暴露。

Data API 的安全加固有两个级别:

  • 完全禁用 Data API。如果您从不需要通过 Supabase 客户端库或 REST 和 GraphQL 端点访问数据库,建议采用此方式。
  • 从 Data API 中移除 public 模式,替换为自定义模式(如 api)。

完全禁用 Data API

如果您从不打算使用 Supabase 客户端库或 REST 和 GraphQL 数据端点,可以完全禁用 Data API。例如,如果您仅通过服务器上的直接连接访问数据库,禁用 Data API 能提供最高级别的保护。

  1. 进入 Supabase 仪表板的 API 设置
  2. 在 Data API 设置 下,关闭 启用 Data API 开关

使用自定义模式替代 public

如果您希望在使用 Data API 的同时增强安全性,可以用自定义模式替代 public 模式。不使用常作为默认空间且权限设置较宽松的 public 模式,您可以更谨慎地控制公开的数据。

所有需要公开的数据、视图或函数都应被明确放入您的自定义模式(我们将称之为 api),而不是默认出现在该模式中。

步骤 1:从公开模式中移除 public

  1. 进入 Supabase 仪表板的 API 设置
  2. 在 Data API 设置 下,从 公开模式 中移除 public。同时从 额外搜索路径 中移除 public
  3. 点击 保存
  4. 进入 数据库扩展 并禁用 pg_graphql 扩展

第二步:创建 api 模式并对外暴露

  1. 连接到您的数据库。您可以使用 psql、Supabase SQL 编辑器或您选择的任何 Postgres 客户端。

  2. 创建一个名为 api 的新模式:

    1
    create schema if not exists api;
  3. 授予 anon 和 authenticated 角色对该模式的使用权限:

    1
    grant usage on schema api to anon, authenticated;
  4. 前往 Supabase 仪表板的 API 设置。

  5. 在 数据 API 设置 下,将 api 添加到 暴露的模式 列表中。确保它是列表中的第一个模式,这样默认情况下会优先搜索该模式。

  6. 在这些新设置下,anon 和 authenticated 可以执行 api 模式中定义的函数,但它们对任何表都没有自动权限。您可以基于表逐个授予权限。例如:

    1
    2
    grant select on table api.<your_table> to anon;grant select, insert, update, delete on table api.<your_table> to authenticated;