Firebase安全规则:校验数据库值与校验auth的安全性是否等同?
Firebase安全规则两种校验方式安全性对比
安全性高低对比
两类校验属于不同的权限校验层级,安全等级差异明确:
- 示例中的auth校验
auth != null属于最低门槛的基础校验,仅能验证请求发起者是完成了Firebase Auth登录的合法用户,完全不涉及用户权限、操作合法性的判断。 - 示例中的数据库值校验
root.child('account').child($uid).child('role').val() === 'admin'属于细粒度权限校验,正常使用场景下安全等级远高于单纯的auth校验。
特别提醒:上述数据库值校验的安全性成立的前提是,规则中的
$uid必须与当前请求的登录用户身份绑定,也就是要增加auth.uid === $uid的前置逻辑,避免攻击者传入其他用户的uid构造非法请求绕过校验。
仅使用数据库值校验能否满足安全要求
分场景判断:
- 如果你的数据库值校验逻辑已经隐含了auth身份校验,比如直接将
auth.uid作为查询路径的一部分,规则写法如下:root.child('account').child(auth.uid).child('role').val() === 'admin'
这种情况下逻辑是完整的,针对对应权限校验场景可以满足安全要求。因为Firebase安全规则中如果auth为null,调用auth.uid会直接返回校验不通过,相当于已经隐含了auth != null的校验逻辑。 - 如果你的数据库值校验未绑定当前登录用户身份,也没有额外增加auth非空判断,仅校验固定路径的数据库值或者使用用户可控的参数作为查询uid,那么存在明显的权限绕过漏洞,无法满足安全要求。
内容的提问来源于stack exchange,提问作者Shean
相关产品推荐
相关产品推荐

