【问题标题】:Firestore security rule to prevent writing arbitrary fields in documents防止在文档中写入任意字段的 Firestore 安全规则
【发布时间】:2019-12-19 14:03:52
【问题描述】:

Firebase Firestore prevent client side creation of fields in a document

根据上面的链接,这个问题以前有人问过,但没有正确回答。

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

const payload = {
 random123: 5,
 anotherRandom123: 5
}

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

如果文档有可选字段,这将不起作用。

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

【问题讨论】:

  • 您是说要编写文档,但并非所有字段都填充在预定义的键中,并且仍然检查写入的字段是否来自预定义的键?
  • @ked 是的,这是正确的!

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢道格!这是现场。我也对您提供的警告感兴趣 - 我想这曾经是用“writeFields”完成的,尽管很好奇现在如何实现。 PS:感谢您在 Firebase 上提供的内容丰富的 youtube 视频 - 它们是我学习 Firebase 不同方面的重要组成部分。
  • 我刚刚提交了一个编辑,因为当我尝试实现它时,似乎键是一种方法,而不是属性! :)
猜你喜欢
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 2018-09-29
相关资源
最近更新 更多