【问题标题】:What is the difference between firestore 'read' and 'list' security rules?firestore 'read' 和 'list' 安全规则有什么区别?
【发布时间】:2019-07-29 11:22:34
【问题描述】:

在 Firestore 访问规则中使用 allow list;allow read; 有什么区别?更具体地说,如果我只允许 list 而不是 read 限额,我的数据会得到什么额外保护?

在我看来,read 和 list 提供了相同的安全性,他唯一的区别是 list 使得合法访问单个对象变得更加麻烦。毕竟,一个坏演员可以简单地列出对象,然后阅读它们的全部内容。如果他知道对象的 ID,他可以简单地将其作为搜索词包含在内。

// The scopes collection is restricted to only allow 'list' requests.
// The scopes collection contains a 'postPhoto' document

// The following request will fail with an insufficient permission error, as expected
await db
  .collection(`/auth/${client}/scopes`)
  .doc('postPhoto')
  .get()
  .then(doc => console.log(doc.id, doc.data()))
  .catch(e => console.error(e))

// But this request will succeed, and it is in effect the same as the previous
await db
  .collection(`/auth/${client}/scopes`)
  .where(firebase.firestore.FieldPath.documentId(), '==', 'postPhoto')
  .get()
  .then(col => col.forEach(doc => console.log(doc.id, doc.data())))
  .catch(e => console.error(e))

我原以为list 访问权限只允许您查看文档的存在,而不能查看其内容。但既然list 显然也允许您访问底层文档数据,为什么不直接使用read

【问题讨论】:

    标签: firebase google-cloud-firestore firebase-security


    【解决方案1】:

    其实listread的一个特例,在documentation中有解释:

    在某些情况下,将读取分解并将写入更多是很有用的 细化操作。例如,...您可能希望允许读取单个文档但拒绝大型查询。

    read 规则可以分为 get 和 list


    更具体地说,让我们采用以下安全规则:

    service cloud.firestore {
        match /databases/{database}/documents {
          match /col1/{docId=**} {
              allow list: if request.auth.uid != null;
          }   
          match /col2/{docId=**} {
              allow get: if request.auth.uid != null;
          }
      }
    }
    

    以下查询将起作用:

    firebase.firestore().collection("col1").get()
    

    虽然这个不起作用:

    firebase.firestore().collection("col2").get()
    

    现在,让我们假设每个集合都有一个 id 为“1”的文档。

    以下查询将起作用:

    firebase.firestore().collection("col2").doc("1").get()
    

    虽然这个不起作用:

    firebase.firestore().collection("col1").doc("1").get()
    

    最后,如果你改变规则如下,使用read,上面的所有查询都可以工作!

    service cloud.firestore {
        match /databases/{database}/documents {
          match /col1/{docId=**} {
              allow read: if request.auth.uid != null;
          }   
          match /col2/{docId=**} {
              allow read: if request.auth.uid != null;
          }
      }
    }
    

    【讨论】:

    • 这回答了关于“get”和“list”之间区别的问题,但我问的是“read”和“list”之间的区别。具体来说,我询问了“读取”和“列表”之间的安全差异,因为您可以使用查询来有效地“获取”仅受“列表”保护的文档。
    • 如前所述,listread 的子案例。我的回答表明,使用read,您可以列出文档集合并获取特定文档,另一方面,使用list,您只能列出文档,而不能获取特定文档。
    • 这就是我认为你错的地方。使用list,您可以通过简单的查询而不是简单的获取来获取文档的内容。例如。 firebase.firestore().collection('col2').where(firebase.firestore.FieldPath.documentId(), '==', '1').get().then(queryResult => console.log(queryResult.docs[0].data()))。所以,回到我最初的问题,鉴于list 不能保护您免受用户阅读您的文档内容的影响,甚至是特定的个人文档,它有什么用? readlist 之间有什么区别(在保护方面)?
    • 好点。您的意思可能是firebase.firestore().collection('col1').where(...),但由于list 适用于查询 和集合读取请求,您可以在queryResult 中获取文档的内容。
    • 啊,是的,我的意思是'col1'list 受保护的集合。 :-)
    【解决方案2】:

    来自Firebase Documentaion

    read 规则可以分解为getlist,而write 规则可以分解为createupdatedelete

    write的规则定义很明确,getlist的区别如下:

    • get 规则将单个文档的检索限制为公共文档或用户创作的文档。
    • list 规则应用与 get 相同的限制,但适用于查询。它还会检查查询限制,然后拒绝任何没有限制或限制大于 10 的查询。

    (来自Securely query data - Firebase Documentation

    在编写规则时,请注意 read 被分解为 getlist - 因此它可以组合起来做任何事情。

    根据您的问题,

    在我看来,read 和 list 提供了相同的安全性,唯一的区别是 list 使得合法访问单个对象更加麻烦。

    list 用于安全地查询集合,并在您从客户端的collection() 方法调用时被触发。另一方面,get 是当您调用从doc() 方法接收数据时。

    毕竟,一个坏演员可以简单地列出对象,然后阅读它们的全部内容。如果他知道对象的 ID,他可以简单地将其作为搜索词包含在内。

    是的,但另一方面,get 可用于防止集合列表查询。 Firebase 团队使用 list 和 get 的一个更好的理由是更容易编写查询,而不是更改安全功能的方式。 (截至目前,有isn't a way to limit query based on where clause,否则它本可以在您的场景中用于保护。)

    【讨论】:

    • 谢谢你。但这并没有回答我的问题的核心,即:如果我只允许列表而不是读取权限,我的数据会得到什么额外的保护?
    • 如果我错了,请纠正我,因为我理解您的问题:如果我将 get 设置为 False,并且仅使用列表,我的数据仍然会暴露给单个查询 - 对吗?
    • 我希望有人向我展示一个示例 allow read: if X; 和一个可通过该 READ 规则检索的示例文档,但如果我将其更改为 allow list: if X,现在将无法检索。
    猜你喜欢
    • 2019-04-18
    • 2018-10-01
    • 2021-04-12
    • 2021-04-09
    • 2018-10-19
    • 2019-07-05
    • 2016-07-18
    • 2010-10-09
    相关资源
    最近更新 更多