我最近收到了来自Firebase的电子邮件,告诉我我的实时数据库具有不安全的规则。这些是我设置的规则:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
这不是安全规则吗?
电子邮件/密码是我启用的唯一登录方法。
答案 0 :(得分:30)
firebaser here
对于电子邮件中关于这些规则不安全的信息不是很明确的情况,我们深感抱歉。保护用户数据对于任何可用的应用程序都是至关重要的一步,因此,我将在下面尝试说明其运行方式。
您拥有的(默认)规则允许登录到您的后端的任何人都可以对整个数据库进行完全读/写访问。这只是一个非常基本的安全层。
一方面,这比只授予每个人对数据库的访问权限更为安全,至少他们必须登录。
另一方面,如果您在Firebase身份验证中启用了任何身份验证提供程序,则即使没有使用您的应用程序,任何人都可以登录到您的后端。取决于提供程序,这就像在浏览器的开发人员控制台中运行一些JavaScript一样容易。登录后,便可以在您的数据库中读写任何内容。这意味着他们可以使用诸如firebase.database().ref().delete()
之类的简单命令删除所有数据。
为使数据访问更加安全,您将需要更严格地控制每个登录用户可以执行的操作。例如,假设您在/users
下保留一个配置文件,其中包含有关每个用户的信息。您可能希望允许所有用户访问这些配置文件,但是您绝对只希望允许用户修改自己的数据。您可以使用以下规则对此进行保护:
{
"rules": {
"users": {
".read": true,
"$user_id": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($user_id)
".write": "$user_id === auth.uid"
}
}
}
}
有了这些规则,每个人(甚至未经身份验证的用户)都可以读取所有配置文件。但是每个配置文件只能由其配置文件的用户修改。有关更多信息,请参见Firebase documentation on securing user data。
除了确保对所有数据的访问均得到授权外,您还需要确保存储的所有数据对您的应用程序所适用的任何规则均有效。例如,假设您要为用户存储两个属性:其名称和年龄(仅出于示例原因,实际上,您可能会存储其出生日期)。因此,您可以将其存储为:
"users": {
"uidOfPuf": {
"name": "Frank van Puffelen",
"age": 48
}
}
要确保只能写入此数据,可以使用以下规则:
{
"rules": {
"users": {
".read": true,
"$user_id": {
".write": "$user_id === auth.uid",
".validate": "data.hasChildren('name', 'age')",
"name": {
".validate": "data.isString()",
},
"age: {
".validate": "data.isNumber()",
},
"$other: {
".validate": false
}
}
}
}
}
这些规则确保每个用户个人资料都具有name
和age
属性,分别具有字符串和数字值。如果有人尝试编写任何其他属性,则该写操作将被拒绝。
以上内容是有关如何考虑保护您(用户)数据的快速入门。我建议您查看Firebase security documentation(和嵌入式视频)以了解更多信息。