数据库

强化数据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. 连接到您的数据库。您可以使用 psqlSupabase SQL 编辑器或您选择的任何 Postgres 客户端。

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

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

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

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

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

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