Firestore安全规则,可防止在文档中写入任意字段

时间:2019-12-19 14:03:52

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

Firebase Firestore prevent client side creation of fields in a document

根据上面的链接,此问题已被询问过,但未正确回答。

我似乎无法弄清楚如何防止用户将垃圾数据上传到文档中的随机字段名称。尽管可以很容易地执行有关“模式”中现有字段的规则,但是我还没有发现任何可以阻止用户使用

更新文档的内容。
const payload = {
 random123: 5,
 anotherRandom123: 5
}

我知道可以对字段总数进行计数并限制它们的数量,但是,如果文档恰巧没有填充每个字段,那么您仍然可以写入垃圾数据。您甚至可以使用in运算符和列表函数来检查某些字段名称。我可以想象的唯一方法是强制文档始终填充您可能需要的所有字段,强制使用固定数量的字段,然后检查以确保每个字段名称都存在/正确。

如果文档具有可选字段,则此方法将无效。

这可能吗?解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

如果要限制可能从客户端应用程序添加到文档中的字段的名称,则需要检查request.resource.data,它是以下所有字段的Map要编写的文档。 Map有一个keys 属性方法,该方法 is 返回所有这些字段名称的List。您可以使用其hasOnly方法检查列表中是否仅包含所需的字段名称:

allow write: if request.resource.data.keys().hasOnly(['a', 'b', 'c']);

此规则要求客户只能对使用命名字段a,b和c的文档进行修改。

请注意,如果您的后端曾经包含其他密钥,则此规则将永远不会对客户端写入失败,因为request.resource.data包含正在写入的最终文档的整个状态,而不仅仅是更改的字段。那是一个更复杂的问题,Stack Overflow上还有其他答案可以解决这个更具体的问题。