当有人用新电话号码注册时,我的用户登录系统将自动在数据库集合中创建一个新文档。
用户文档的创建和更新是通过客户端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
,而别无其他。还有其他人遇到同样的麻烦吗?
还有实现此目的的任何想法?
答案 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']);