【问题标题】:Serious problem Firebase read rule for blocked user被阻止用户的严重问题 Firebase 读取规则
【发布时间】:2020-08-20 22:12:00
【问题描述】:

我正面临 Firebase 安全规则的严重问题。我想将 read 设置为 false 以阻止用户搜索。这是我的数据库结构。

users:{
      uid1:{
           name:"Joe",
           created:1226287
          },
      uid2:{
          name:"John",
          created:1273725
          },
      uid3:{...},
      uid4:{...},
      ...
   },

 blocked:{
       uid1:{
            uid2: true,
            uid4: true
       }
   }

考虑上面的结构,假设user2users 节点下搜索一个用户,输入“Joe”,然后点击回车。我这样设置我的 firebase 规则。

 users:{
     $uid:{
         ".read":"!root.child('blocked').child($uid).hasChild(auth.uid)"
         }
     }

如果user2 查询user/user1 路径,则此规则可以正常工作。但是当user2搜索到时,如何防止他获取被屏蔽的用户数据。

【问题讨论】:

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


    【解决方案1】:

    没有直接的方法可以获取没有阻止该特定用户的用户列表。但如果用户根据用户名或其他一些基于用户的条件进行搜索,那么最好的工具是 Firebase Functions。

    实现函数的步骤(考虑基于名称搜索)(从客户端调用firebase函数并传递搜索名称):

    1. 获取所有具有相同名称的用户详细信息。
    2. 获取所有屏蔽了请求用户的用户(或同名用户)。
    3. 弹出所有阻止请求用户的用户。
    4. 将用户列表发回给请求的用户。

    为什么 Firebase Function 是这种情况下的最佳选择?因为函数是在安全环境中执行的,可以绕过安全规则。

    Read more about the functions here.

    【讨论】:

    • 这是实现搜索功能的最佳且唯一的方法吗? (为了使用云功能,我必须将我的帐户升级到按量付费计划,而我的国家缅甸不在创建计费帐户的列表中。:'( )
    • 从我的角度来看,我没有看到任何其他方法。保持在客户端获取畅通用户的逻辑可能是有风险的(仅供参考,我不建议您这样做)。为了克服这个问题,您可以使用在远离客户端的安全环境中执行的 firebase 函数。
    • 关于在缅甸创建一个计费帐户,请阅读有关它的一些帖子。有人可能遇到了这个问题,并可能为此提供了一些解决方案。
    • 我没有找到关于从缅甸创建结算帐户的解决方案。我联系了帮助组织,他们回复等待。 :'(
    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 2017-03-11
    • 2020-07-25
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    相关资源
    最近更新 更多