firebase安全规则仅允许对文档的某些特定字段/属性进行写权限

时间:2019-12-27 14:42:14

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

当有人用新电话号码注册时,我的用户登录系统将自动在数据库集合中创建一个新文档。

用户文档的创建和更新是通过客户端JavaScript完成的,我正在使用Firestore安全规则来防止基本用户编写或修改文档属性,例如 isActivated isAdmin 。它将符合以下规则:

allow write: if request.response.data.isActive==null || request.response.data.isActive == response.data.isActive &&
request.response.data.isAdmin==null || request.response.data.isAdmin == response.data.isAdmin;

但是,仍然有些黑客可以轻松地在客户端修改dbRef.add()函数,并添加无用的数据,例如{age: "hacker won't tell ya", hackersName: "Naah!", foo: "bar", bar: "foo"}等。

我希望用户文档仅保留属性name, phone_number, isActive, isAdmin, FCMtoken,而别无其他。还有其他人遇到同样的麻烦吗? 还有实现此目的的任何想法?

1 个答案:

答案 0 :(得分:1)

要断言资源仅具有特定的键列表,可以使用rules.List#hasOnly(),如果出现的值不在给定列表中,则它将评估为false。

request.response.data.keys().hasOnly(['name', 'phone_number', 'isActive', 'isAdmin', 'FCMtoken'])

将此与您的其他(固定)限制结合在一起可以得出:

allow write: if (request.response.data.isActive == null || request.response.data.isActive == response.data.isActive)
             && (request.response.data.isAdmin == null || request.response.data.isAdmin == response.data.isAdmin)
             && request.response.data.keys().hasOnly(['name', 'phone_number', 'isActive', 'isAdmin', 'FCMtoken']);