使用第三方认证的Firebase实时数据库可否设置全局读写权限?
关于Firebase实时数据库全局开放读写权限的风险说明
首先明确结论:绝对不要在生产环境使用你贴的这套全局允许读写的规则,哪怕你用了第三方身份认证,也会带来非常严重的安全漏洞。
- 首先这套规则等于把你的数据库完全暴露在公网,任何拿到你数据库URL的人都可以无需任何验证,直接读取、修改、删除所有数据:
- 恶意用户可以直接篡改所有玩家的游戏数据,比如修改自己的段位、道具数量、对局分数,完全破坏游戏公平性
- 甚至可以直接清空整个数据库的所有内容,导致你的服务直接瘫痪
- 还可以批量爬取你库里存储的所有玩家信息,造成用户隐私泄露
- 你提到的「需要实时同步玩家操作所以要开放权限」是错误认知:实时同步和安全规则完全不冲突,哪怕你用的是第三方身份认证,也完全可以通过Firebase的自定义令牌机制,把你的第三方认证和Firebase的权限体系打通,不需要全局开权限。
- 你可以在自己的服务端用第三方认证完成用户身份校验之后,为用户签发Firebase认可的自定义JWT令牌,客户端拿到这个令牌之后就可以正常和Firebase实时数据库交互
- 之后你就可以在安全规则里通过
auth变量拿到用户的身份信息,做细粒度的权限控制,比如只允许用户修改自己所属对局的操作数据,不允许越权操作其他人的内容
你可以参考下面的最小粒度规则思路调整,既不影响实时同步能力,还能规避恶意操作风险:
{ "rules": { "games": { "$gameId": { // 只允许加入该对局的玩家读取本局数据 ".read": "auth != null && data.child('players').hasChild(auth.uid)", // 只允许玩家修改自己的操作字段,不允许修改对局核心数据 "players": { "$playerId": { "actions": { ".write": "auth != null && $playerId === auth.uid" } } } } } } }
内容的提问来源于stack exchange,提问作者Codojojo
相关产品推荐
相关产品推荐

