我想允许应用程序内部的链接如下:
mywebsite.com?u=nc27ri3ucfyinyh3
其中nc27ri3ucfyinyh3
是一个uuid,因此可以将链接发送给匿名用户。匿名用户应该能够查看该页面(读取数据库),但是它也应该登录到他们已查看该链接的数据库(数据库写入)。
当我们的Firestore规则如下时,我们会收到警告
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write;
}
}
}
因为它不安全。
您的安全规则被定义为公共规则,因此任何人都可以窃取,修改或删除数据库中的数据
我们应该如何处理这些匿名用户的情况?
答案 0 :(得分:1)
第一件事是,您可以编写一组比现有限制更严格的规则(例如,将写入限制为仅一个集合(通过将match /{document=**}
行更改为更具限制性的内容(例如,仅将{ {1}}集合之类的东西。当然,这仍然有效地允许匿名用户完整运行您的数据库,但仅限于该集合之内。
此外,您可以通过links
对象将validation添加到传入请求中)-可能由于用户的匿名性质,您仍然会有一组相对不安全的规则。
数据验证方法既可以查看数据库的当前状态(在request.resource
中,也可以查看传入请求的内容(在resource.data
中)。这是Resource和Request对象的参考文档。
以下是假定这些文档的示例规则:
request.resource
集合中/uuids
和content
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;
}
}
}
开始使用云功能。