【问题标题】:Firebase realtime database rules prevent node deletionFirebase 实时数据库规则防止节点删除
【发布时间】:2020-04-08 04:29:52
【问题描述】:

我的用户数据库如下所示:

root
  users
   453453452
       name: user1
       email: email@example.com
       permissions: [1,2,3]
   457575684
       name: user2
       email: email2@example.com
       permissions: [1,2,3]
   234235346
   123245346
   436286785
   474574725

我要做的是允许写入/users 和用户节点/users/453453452,但防止删除用户表或任何用户节点。

我尝试了什么:

{
    "rules": {
        "users": {
            ".read": false,
            ".write": "newData.exists() && newData.val() != null",
            "$user": {
                ".read": true,
                ".write": "newData.exists() && newData.val() != null",
            }
        }
    }
}

如果我向/users/453453452.json 发送删除请求,我仍然可以删除任何节点。

我能得到一些帮助吗?

编辑: 1- 成功购买后将用户添加到数据库,其中userID 是用户电子邮件地址的哈希唯一标识符。

fetch(myAPI + "/" + userID + ".json", {
    method: 'PUT',
    headers: {'Accept': 'application/json, application/xml, text/plain, text/html, *.*',
        'Content-Type': 'application/json; charset=utf-8'},
    body: JSON.stringify({"name": userName,"email": userEmail, "order_id": orderID})
});

我可以轻松地使用 POSTMAN 向 myAPI + "/" + userID + ".json" 发送 DELETE 请求以删除我试图避免的所选记录,甚至向 /users 发送一个空数组,这将擦除整个数据库。

【问题讨论】:

  • 这听起来很意外。您是否以任何方式验证您的 REST 客户端?
  • 不,我不是。我们正在努力使应用程序尽可能简单,在我们的场景中,我们不能要求用户登录或验证。
  • 知道了。我“希望”你传递了一个 OAuth 令牌,因为这可以解释。你能用你做的确切电话的例子来编辑你的问题吗?我将尝试重现此问题,并且可能希望使用您的实现作为我的参考。
  • 我编辑了这个问题,我希望编辑足够有用。
  • 你能找到办法吗,弗兰克?

标签: javascript firebase-realtime-database firebase-security


【解决方案1】:

我无法重现问题here。我使用的完整代码是:

var url = "https://stackoverflow.firebaseio.com/61015647";

fetch(url+".json", {
  method: 'POST', // *GET, POST, PUT, DELETE, etc.
  headers: {
    //'Content-Type': 'application/json'
    'Content-Type': 'application/x-www-form-urlencoded',
  },
  body: JSON.stringify(Date.now())
}).then(function(response) {
  return response.json()
}).then(function(json) { 
  console.log("Child "+json.name+" added, trying to delete with POST...");
  return fetch(url+"/"+json.name+".json", {
    method: "DELETE"
  })
}).then(function(response) {
  return response.json()
}).then(function(json) { 
  console.log(json);
}).catch(function(error) {
  console.error(error);
});

以及相关规则:

{
  "rules": {
    "61015647": { 
      ".read": true, 
      "$child": { 
        ".write": "newData.exists() && newData.val() != null" 
      } 
    }
  }
}

当我运行这段代码时,输​​出是:

null(来自 on("value" 监听器的初始值)

“已添加子级 -M44hzNISkQNvycyH63B,正在尝试使用 POST 删除...”

[对象对象] { 错误:“权限被拒绝” }

[object Object] { (on("value" listener 的下一个值) -M44hzNISkQNvycyH63B:1586012616166 }

【讨论】:

  • 哦,谢谢你花时间检查,你试过用 PostMan 做吗?我可以使用 PostMan 轻松发送删除请求并删除节点。
  • 我故意选择了我能想到的最简单的实现,没有库或工具,以排除那些可能在做的事情。如果 Postman 允许您做更多事情,它可能会发送额外的信息来进行身份验证。如果您在与我类似的环境中设置复制,我会看看。
  • 有什么更新吗?如果您看到的行为与我在 jsbin 中显示的不同,我很乐意在类似的实现中看到它,我可以看看。
  • 嗨弗兰克,请多容忍我一点,我稍后会在这里发表评论。
猜你喜欢
  • 2021-04-03
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多