允许匿名用户写入Firebase Firestore

时间:2019-11-25 21:14:09

标签: firebase google-cloud-firestore

我想允许应用程序内部的链接如下:

mywebsite.com?u=nc27ri3ucfyinyh3

其中nc27ri3ucfyinyh3是一个uuid,因此可以将链接发送给匿名用户。匿名用户应该能够查看该页面(读取数据库),但是它也应该登录到他们已查看该链接的数据库(数据库写入)。

当我们的Firestore规则如下时,我们会收到警告

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}

因为它不安全。

  

您的安全规则被定义为公共规则,因此任何人都可以窃取,修改或删除数据库中的数据

我们应该如何处理这些匿名用户的情况?

1 个答案:

答案 0 :(得分:1)

第一件事是,您可以编写一组比现有限制更严格的规则(例如,将写入限制为仅一个集合(通过将match /{document=**}行更改为更具限制性的内容(例如,仅将{ {1}}集合之类的东西。当然,这仍然有效地允许匿名用户完整运行您的数据库,但仅限于该集合之内。

此外,您可以通过links对象将validation添加到传入请求中)-可能由于用户的匿名性质,您仍然会有一组相对不安全的规则。

数据验证方法既可以查看数据库的当前状态(在request.resource中,也可以查看传入请求的内容(在resource.data中)。这是ResourceRequest对象的参考文档。

以下是假定这些文档的示例规则:

  • 存在于request.resource集合中
  • 是通过其他方法(经过身份验证的用户,管理API等)创建的
  • 只需要通过ID来获取,而不是作为集合查询。
  • 只有两个字段:/uuidscontent
  • visits必须是整数,并且只能递增
  • 创建文档后,visits被初始化为零。

我还没有广泛测试这些规则,只是使用模拟器来确认它们的行为大致符合预期,对于您打算部署的任何规则,我建议您write extensive tests。特别是,我不确定仅在文档竞争激烈时才增加测试的行为。

visits

例如,这将使您能够确保仅精确触摸所需字段,并且仅使用有效数据(例如正整数或类似数据)。

请记住-安全规则只是您的 保护-用户可以在这些规则中针对数据库运行任意代码,而不仅仅是您提供的代码。因此,例如,如果他们可以全面阅读该收藏集,那么他们可以从字面上阅读该收藏集中的整个文档集。


或者,写一个http,https或可调用的cloud function来满足您的需要可能更有意义-通过写操作注册链接已被使用,然后重定向或提供必要的服务数据本身。这使您可以更好地控制特定的写入,但是确实要增加一些成本。这样做的好处是,您根本不需要允许对数据库的任何公共或开放访问。

如果该网站是通过rewrite rules托管在Firebase托管上的,则还可以从rules_version = '2'; function notUpdating(field) { return !(field in request.resource.data) || resource.data[field] == request.resource.data[field] } service cloud.firestore { match /databases/{database}/documents { match /uuids/{uuidValue} { allow get: if true; allow update: if (request.resource.data.keys().size() == 2 && notUpdating('content') && request.resource.data['visits'] == int(request.resource.data['visits']) && request.resource.data['visits'] > 0 && request.resource.data['visits'] == resource.data['visits'] + 1); allow write: if false; // these 4 lines can also just be omitted allow list: if false; allow delete: if false; allow create: if false; } } } 开始使用云功能。

相关问题