在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呢?
发布于 2019-07-29 12:17:06
实际上,list是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;
}
}
}发布于 2020-05-15 11:16:30
read规则可以分解为get和list,而write规则可以分解为create、update和delete。
write规则定义非常清楚,get和list之间的区别如下:
在编写规则时,请注意read被分解为get和list,因此它可以将两者结合使用。
从你的问题来看,
在我看来,read和list提供了相同的安全性,而他唯一的不同之处在于,这个列表使得合法访问奇异对象变得更加麻烦。
list用于安全地查询集合,并在客户端从collection()方法调用时启动。另一方面,get是当您调用从doc()方法接收数据时。
毕竟,一个糟糕的参与者可以简单地列出对象,然后读取它们的全部内容。如果他知道对象的ID,他可以简单地把它作为一个搜索词。
是的,另一方面,可以使用get来防止集合列表查询。Firebase团队使用list和get的一个更好的理由是使编写查询变得更容易,而不是改变安全功能的方式。(到目前为止,存在不是一种基于where子句限制查询的方法。,否则它可能被用于在您的场景中进行保护。)
https://stackoverflow.com/questions/57252795
复制相似问题