我想创建一个新闻订阅表格。意味着用户可以注册我的时事通讯而无需创建帐户。
我想做一个简单的插入。但是保护它的最佳方法是什么?
我已经实现了“匿名登录”(https://firebase.google.com/docs/auth/web/anonymous-auth)
我需要基本规则,read
检查用户是否已全部注册,write
将用户数据推送到实时数据库。
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
完成匿名登录后,我将其推送到实时数据库中。
let dbConnection = firebase.database().ref('/newsletter_user');
dbConnection.push(datas).then(callback);
问题是匿名身份验证不检查身份验证域。 (How to block localhost in firebase?)
这意味着用户可以获取我的ApiKey并执行插入或读取数据到我的realbase数据库中。
那对我来说似乎并不安全。我该怎么做才能提高安全性?
答案 0 :(得分:2)
可以提高安全性的一件事是限制数据库访问。当前,您对数据库具有基本的读/写规则,这意味着经过身份验证的人员可以在数据库中执行任何操作。如果我愿意,我可以在您的{
"rules": {
"newsletter_user" : {
".read": "auth != null",
".write": "auth != null"
}
}
}
节点中写完整的百科全书:)
因此,您可以做的第一件事就是限制对特定位置的读写访问:
newsletter_user
现在我只能在{
"rules": {
"newsletter_user" : {
".read": "auth != null",
".write": "auth != null",
// a valid newsletter_user must have attributes "color" and "size"
// allows deleting newsletter_user (since .validate is not applied to delete rules)
".validate": "newData.hasChildren(['color', 'size'])",
"size": {
// the value of "size" must be a number between 0 and 99
".validate": "newData.isNumber() &&
newData.val() >= 0 &&
newData.val() <= 99"
},
"color": {
// the value of "color" must exist as a key in our mythical
// /valid_colors/ index
".validate": "root.child('valid_colors/' + newData.val()).exists()"
}
}
}
}
节点下做某事。
接下来,您可以使用validation rules确保仅写入所需的数据:
CASE temperature WHEN ...