Firebase数据库结构锁定问题:SPA非法字段写入排查
解决Firebase数据库非法字段写入的方案
嘿,我懂你这种头疼的情况——明明已经把用户权限锁死了,结果还是能通过前端篡改偷偷塞额外字段进去。别慌,Firebase的安全规则其实能帮你把数据结构也焊死,只让你指定的字段能写进去,完美适配你的users-->userId-->projects-->uniqueKey层级需求。
核心思路是:在原有认证权限的基础上,新增数据结构验证规则,精准限制允许写入的字段和数据类型。以下是针对你的场景的具体规则示例:
{ "rules": { "users": { "$userId": { // 保留你原有的用户权限控制:仅当前认证用户可读写自身数据 ".read": "auth != null && auth.uid == $userId", ".write": "auth != null && auth.uid == $userId", "projects": { "$projectId": { // 关键:验证项目节点的结构,拒绝非法字段 ".validate": " // 1. 确保必须包含你定义的必填字段(比如project_title、project_desc,按需调整) newData.hasChildren(['project_title', 'project_desc']) && // 2. 限制字段数量,禁止添加额外字段(这里数量对应你允许的字段数) newData.keys().size() == 2 && // 3. 可选:验证每个字段的类型,确保数据符合预期 newData.child('project_title').isString() && newData.child('project_desc').isString() " } } } } } }
规则细节解释:
.validate:这是阻止非法写入的核心,它会在写入操作执行前严格检查数据结构:newData.hasChildren(...):确保提交的数据必须包含你指定的必填字段,少一个都不行newData.keys().size():限制节点的字段总数刚好等于你允许的数量,这样用户添加的blablab这类额外字段会直接被拒绝- 字段类型验证:比如
isString()、isNumber(),可以避免前端传入不符合预期的数据类型
额外注意事项:
- 如果有可选字段,可以调整
keys().size()的数值,同时用newData.child('optional_field').exists()来判断可选字段的存在性 - 写完规则后,一定要用Firebase控制台的规则模拟器测试:模拟一个带额外字段的写入请求,确认规则会拒绝它
- 前端也建议做一层数据验证:虽然安全规则是最后一道防线,但前端提前过滤非法字段能提升用户体验,减少无效请求
内容的提问来源于stack exchange,提问作者Jamille
相关产品推荐
相关产品推荐

