首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“阅读”和“列表”安全规则之间有什么区别?

“阅读”和“列表”安全规则之间有什么区别?
EN

Stack Overflow用户
提问于 2019-07-29 11:22:34
回答 2查看 2.4K关注 0票数 6

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

在我看来,read和list提供了相同的安全性,而他唯一的不同之处在于,list使它在合法访问奇异对象时变得更加繁琐。毕竟,一个糟糕的参与者可以简单地列出对象,然后读取它们的全部内容。如果他知道对象的ID,他可以简单地把它作为一个搜索词。

代码语言:javascript
复制
// 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呢?

EN

回答 2

Stack Overflow用户

发布于 2019-07-29 12:17:06

实际上,listread的一个特定案例,如文档中所解释的那样:

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

具体来说,让我们来看看以下安全规则:

代码语言:javascript
复制
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;
      }
  }
}

以下查询将有效:

代码语言:javascript
复制
firebase.firestore().collection("col1").get()

虽然这个办法行不通:

代码语言:javascript
复制
firebase.firestore().collection("col2").get()

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

以下查询将有效:

代码语言:javascript
复制
firebase.firestore().collection("col2").doc("1").get()

虽然这个办法行不通:

代码语言:javascript
复制
firebase.firestore().collection("col1").doc("1").get()

终于了,如果您按照下面的规则更改规则,使用read,那么上面的所有查询都会工作!

代码语言:javascript
复制
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;
      }
  }
}
票数 13
EN

Stack Overflow用户

发布于 2020-05-15 11:16:30

来自[消]火力基础文件

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

write规则定义非常清楚,getlist之间的区别如下:

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

(来自安全查询数据. Firebase文档)

在编写规则时,请注意read被分解为getlist,因此它可以将两者结合使用。

从你的问题来看,

在我看来,read和list提供了相同的安全性,而他唯一的不同之处在于,这个列表使得合法访问奇异对象变得更加麻烦。

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

毕竟,一个糟糕的参与者可以简单地列出对象,然后读取它们的全部内容。如果他知道对象的ID,他可以简单地把它作为一个搜索词。

是的,另一方面,可以使用get来防止集合列表查询。Firebase团队使用list和get的一个更好的理由是使编写查询变得更容易,而不是改变安全功能的方式。(到目前为止,存在不是一种基于where子句限制查询的方法。,否则它可能被用于在您的场景中进行保护。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57252795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档