Firebase实时数据库安全配置咨询:确保用户仅访问自身数据
Firebase实时数据库安全规则评估与优化方案
当前规则的核心安全漏洞
你现在的规则存在严重问题:$account节点的.read设为true意味着任何知道以太坊钱包地址的人都能读取对应账户的数据,根本做不到“仅用户自身访问”。比如只要有人拿到了account1的地址,哪怕不是该账户的所有者,也能直接调用get(child(dbRef, "accounts/account1"))读取数据,完全不符合你的安全需求。
必须的核心改进:绑定身份与钱包地址
要确保只有账户所有者能访问数据,必须把Firebase Auth的用户身份和以太坊钱包地址绑定,让安全规则能验证请求者的身份是否匹配目标账户:
步骤1:实现以太坊钱包登录Firebase
通过Firebase Auth的自定义认证机制,让用户用以太坊钱包签名登录,将钱包地址存入用户的自定义声明(customClaims)或Auth用户资料中。比如后端生成自定义Token时,把钱包地址作为walletAddress字段加入token。
步骤2:修改安全规则验证身份
更新规则,只有当请求者的认证信息中的钱包地址与$account完全匹配时,才允许读取:
{ "rules": { ".read": false, ".write": false, "accounts": { "$account": { ".read": "$account === auth.token.walletAddress", ".write": "$account === auth.token.walletAddress" // 若需要用户修改自身数据则保留,否则设为false } } } }
这样,只有通过认证且钱包地址匹配的用户,才能访问对应账户的数据,彻底杜绝了陌生人仅凭地址就能读取的问题。
额外安全加固措施
- 限制写入操作:如果用户不需要修改数据,保持
.write: false;若需要写入,除了身份验证,还可添加字段验证,比如限定只能修改特定字段、字段格式符合要求(例如以太坊地址格式校验):"$account": { ".write": "$account === auth.token.walletAddress && newData.hasChildren(['item1', 'item2']) && newData.child('item1').isString()", ".read": "$account === auth.token.walletAddress" } - 防止枚举攻击:虽然以太坊地址枚举难度高,但可通过Firebase Auth的登录速率限制、数据库访问速率限制,降低暴力枚举的风险。
- 客户端加密敏感数据:对于隐私数据,在客户端加密后再存入数据库,即使数据库出现安全漏洞,原始数据也不会泄露。
- 定期测试安全规则:使用Firebase控制台的规则模拟器,模拟未认证用户、其他账户用户的请求,验证规则是否能有效拦截非法访问。
- 监控访问日志:通过Firebase控制台的监控面板,跟踪数据库的访问记录,及时发现异常请求。
内容的提问来源于stack exchange,提问作者aronsommer
相关产品推荐
相关产品推荐

