Firebase 规则 query.equalTo 始终在 REST 上返回“权限被拒绝”

Posted

技术标签:

【中文标题】Firebase 规则 query.equalTo 始终在 REST 上返回“权限被拒绝”【英文标题】:Firebase rule query.equalTo always returns "Permission denied" on REST 【发布时间】:2018-07-02 21:31:01 【问题描述】:

我正在尝试确保我的数据库安全,我的场景数据如下所示:

receipts: [
  
    userId: id,
    ...
  ,
  
    userId: id,
    ...
  ,
...
]

每张收据都有userId 字段,其中包含有关其创建者的信息。我想返回特定用户的收据列表。为此,我进行了如下所示的 REST 调用:

https://[PROJ_NAME].firebaseio.com/receipts.json?orderBy="userId"&equalTo="[USER_ID]"&auth=[TOKEN]

并且在所有设置为打开的规则上,它都非常有效。但我想保护我的数据库,这样其他用户就无法通过更改 URL 来查看所有资源。

在 firebase 文档中,我发现了这样的 sn-p:

"baskets": 
  ".read": "auth.uid != null &&
            query.orderByChild == 'owner' &&
            query.equalTo == auth.uid" // restrict basket access to owner of basket

这似乎是合理的,所以我将它应用到我的配置中,但现在它总是失败。这是我的文件的样子:


  "rules": 
      "receipts": 
        ".indexOn": ["userId"],
        ".read": "auth.uid != null &&
                  query.orderByChild == 'userId' &&
                  query.equalTo == auth.uid"
    
  

不幸的是,它总是返回"error" : "Permission denied"。因为那件事我已经失去了一整天:(

谁能帮帮我?

【问题讨论】:

您是否尝试过引用equalTo 的值?例如equalTo="[USERID]" 是的,引用和orderBy="userId"一样。 我在security rules documentation 中没有找到关于query 变量的任何内容。我认为您的规则中使用 query 的条款无效。您能否发布指向您发现在规则中使用query 的文档或示例的链接? @BobSnyder:firebase.google.com/docs/database/security/…我什至不知道这已经发布了,所以需要一点时间来赶上......并可能更新几百个问题来解释“规则现在可以用于过滤数据,如果您确保查询和规则一致”。 根据我使用 android SDK 完成的测试,我同意 equalTo 似乎已损坏。 【参考方案1】:

firebaser 在这里

更新 (2018-01-25):此错误现已修复。由于这是服务器端问题,因此无需更新您的 SDK。

.


原答案如下


目前服务器解释使用query.orderByChildquery.equalTo 的安全规则的方式存在错误。我们正在努力解决问题。

要暂时解决此问题,您可以将query.startAtquery.endAt 组合使用以获得相同的结果:

    ".read": "auth.uid != null &&
              query.orderByChild == 'userId' &&
              query.startAt == auth.uid &&
              query.endAt == auth.uid"

【讨论】:

太棒了!此解决方法按预期工作。我什至不必更改我的查询。以上规则适用于查询 URL 中的equalTo 是的,我注意到它适用于相同的查询。我立即尝试查看那里是否存在漏洞。 :-) 如果你找到了,请告诉我!或者,如果您当然发现更多问题。 这总是为我返回 null,即使我有相同 uid 的数据 @FrankvanPuffelen 我想我看到类似的权限被拒绝bug with the startAt rule in this question

以上是关于Firebase 规则 query.equalTo 始终在 REST 上返回“权限被拒绝”的主要内容,如果未能解决你的问题,请参考以下文章

使用解析云函数

Firebase 安全规则阻止写入 Firebase

Firebase 的 ProGuard 规则是啥?

Firebase 实时规则

所有存储桶的 Firebase 存储安全规则

读取 Firebase 存储映像安全规则