You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制Firebase实时数据库仅支持特定域名参数的查询访问?

如何限制Firebase实时数据库仅支持特定域名参数的查询访问?

我来帮你搞定这个权限控制的问题!首先你得注意,当前的Firebase规则完全开放(.read和.write都设为true),这才导致任何人都能直接看到所有白名单域名。要实现你要的效果,我们需要调整数据结构+修改规则,具体步骤如下:

第一步:调整数据库的数据结构

你现在用的是数组存储域名,这种结构在Firebase里很难做精准的访问权限控制——因为数组的索引是数字,没法通过请求的域名参数直接定位到对应的元素。建议改成对象结构,把每个域名作为键,值可以设为true(或者其他标记值),示例如下:

{
  "www.eatingfact-tenolent.blogspot.com": true,
  "www.prothomalo-tenolent.blogspot.com": true
}

这种结构不仅能让Firebase规则精准匹配单个域名,还能提升查询效率。

第二步:修改Firebase实时数据库规则

接下来我们要写规则,实现两个核心要求:

  1. 直接访问domains.json(也就是根路径/domains)时,禁止读取任何内容
  2. 只有访问domains.json/[具体域名]时,才返回该域名的存在状态(存在则返回值,不存在则拒绝访问)

替换你的规则为以下内容:

{
  "rules": {
    "domains": {
      // 禁止直接读取整个白名单列表
      ".read": false,
      // 允许读取单个域名节点,仅当该域名在白名单中存在时
      "$domain": {
        ".read": "data.exists()"
      }
    },
    // 严格锁死写权限,这里建议用Firebase Auth限制仅管理员能写,示例中先设为false防止恶意修改
    ".write": false
  }
}

规则解释:

  • 当有人直接访问https://sitelicenses-default-rtdb.firebaseio.com/domains.json时,因为/domains节点的.read设为false,会返回权限拒绝,看不到任何内容。
  • 当请求带域名参数,比如https://sitelicenses-default-rtdb.firebaseio.com/domains.json/www.prothomalo-tenolent.blogspot.com,规则会检查$domain对应的节点是否存在:
    • 如果域名在白名单里,data.exists()为true,允许读取,返回true(你设置的对应值)。
    • 如果域名不在白名单里,data.exists()为false,返回权限拒绝,间接说明域名未被授权。

额外的安全建议

  • 锁死写权限:千万不要像原来那样开放.write为true,不然任何人都能修改你的白名单。建议通过Firebase Auth限制仅你的管理员账号能写,比如:
    ".write": "auth != null && auth.uid === '你的管理员账号UID'"
    
  • 测试规则:用Firebase控制台的「规则模拟器」测试不同请求场景,比如直接访问根路径、访问存在的域名、访问不存在的域名,确保符合预期。

关于原数组结构的说明

如果你实在不想修改数组结构,很遗憾——Firebase规则几乎没法实现你的需求,因为数组的索引是数字,无法通过请求的域名参数关联到数组中的某个元素,所以强烈建议改成对象结构。

备注:内容来源于stack exchange,提问作者Hasnain Mahmud Hira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:00:31