【问题标题】:Firebase Security Rules: Is checking database value equally secure with checking auth?Firebase 安全规则:检查数据库值与检查身份验证是否同样安全?
【发布时间】:2021-10-22 23:33:09
【问题描述】:
我想知道为用户检查“数据库值”(下面的示例)是否与“检查身份验证”(下面的示例)一样安全、更高或更低。
检查“数据库值”对于应用程序来说是否足够安全?
检查数据库值:
"root.child('account').child($uid).child('role').val() === 'admin'"
检查身份验证:
"auth != null"
【问题讨论】:
标签:
firebase
firebase-realtime-database
firebase-authentication
firebase-security
【解决方案1】:
如果只有您或任何授权用户可以在数据库中编辑该角色,那么使用安全规则是安全的。我建议在数据库中存储一个单独的 admins 节点并检查该节点中的用户 UID,以便更轻松地编写安全规则来保护它。
admins
|-user1: true
|-user2: true
然后你可以编写以下规则来检查用户是否是管理员:
root.child('admins').child(auth.uid).val() === true
如前所述,确保只有授权用户才能向该节点添加新管理员。
但是,请注意实时数据库中的数据只能在实时数据库的安全规则中访问。如果您以后需要使用 Firestore 或 Storage,您将无法在其安全规则中检查管理员。在这种情况下,使用Custom Claims 可能是更好的方法。
如果您需要检查请求数据的用户是否是管理员,您应该使用auth.uid 而不是$uid。 $uid 是一个通配符,将在被访问的路径中占用匹配值。使用$uid 本身听起来并不安全,就像我尝试向/path/($uid=someId) 发出请求一样,您的规则将在管理节点中检查someId,以便用户可以尝试传递多个不安全的ID。