【问题标题】:Preventing duplicate usernames in Firebase防止在 Firebase 中出现重复的用户名
【发布时间】:2018-09-19 04:21:26
【问题描述】:

我正在尝试使用 Firebase 安全规则来防止在我的应用中发生一些不良情况。我目前的结构是:

"usernames": {
    "twitter:123": "jack",
    "google:456": "bob"
}

这里的问题是我无法实施安全规则,这样第三个用户(比如facebook:789)就无法进入并劫持用户名“bob”并访问该用户的数据(我的数据已整理好)通过用户名)。

对于这种情况,可接受的解决方法是什么?我尝试反转键/值对,这允许用户名的唯一性:

"usernames": {
    "jack": "twitter:123",
    "bob": "google:456"
}

但是,由于这不会强制 UID 的唯一性,任何用户都可以发送垃圾用户名 - 恶意的 facebook:789 可以使用任何尚未使用的用户名,这将是一个 PITA 来解决。

有没有办法使用 Firebase 安全规则来解决这个难题?还是唯一的答案是受信任的服务器?受信任的服务器仍会出现可能的并发问题。

【问题讨论】:

    标签: security firebase


    【解决方案1】:

    好的,我想我明白了。就像 Firebase 中的许多事情一样,答案在于勤奋地使用非规范化 :)

    此解决方案仍是暂定,因此如果您有更正或更好的想法,请不要犹豫更正/编辑/评论/回答。

    用户名/uid 对需要以两种 格式存储。由于没有更好的名字,我称之为互锁

    {
      "usernameInterlock" : {
        "confirm" : {
          "twitter:123" : "jack"
        },
        "request" : {
          "jack" : "twitter:123"
        }
      }
    }
    

    以下是安全规则:

    {
      "rules": {
        "usernameInterlock": {
            "request": {
                "$username": {
                  ".read": true,
                  ".write": "auth.uid == newData.val()
                  && !(
                    data.exists()
                    && root.child('usernameInterlock').child('confirm').child(data.val()).val() == $username
                    )"
                }
              },
            "confirm": {
                "$uid": {
                  ".read": true,
                  ".write": "auth.uid == $uid 
                  && root.child('usernameInterlock').child('request').child(newData.val()).val() == auth.uid"
                }
              }
        }
      }
    }
    

    流程是:

    1. 用户将他们的uid 放入/usernameInterlock/request/$desiredUsername。这是可写的除非/usernameInterlock/confirm/$uid_2 == $desiredUsername 在这种情况下它属于$uid_2。任何人都可以请求他们想要的任何用户名(无论他们想要多少),因为除非他们在confirm 之下,否则他们没有任何意义。如果有人太疯狂,这可以被清除。
    2. 然后用户将$desiredUsername 写入/usernameInterlock/confirm/$uid。仅当已填充适当的 request 子项时才能写入此内容。这将成为确定用户用户名的规范方式。

    要验证用户名,请查找/usernameInterlock/request/$username,然后查找在/usernameInterlock/confirm/$uid 中获得的$uid,如果该值与$username 匹配,则($username, $uid) 是有效对。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-07
      • 2017-06-08
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 2015-04-13
      • 1970-01-01
      相关资源
      最近更新 更多