如何防止客户修改firebase数据(在没有后端的Web应用程序中)?

时间:2015-12-01 09:41:47

标签: angularjs security authentication firebase

我最近开始探索firebase作为我的角度JS单页网站的身份验证解决方案,它看起来很完美。但是从安全角度来看,我不太确定在我的应用程序中将逻辑保留在客户端。

假设我在我的网站上注册并且应该完成他的个人资料的客户检查'isProfileCompleted'。我将数据保存在由UID键入的JSON中,只对客户进行独占写访问。

问题是,既然客户端具有对其数据的写访问权限,他可以通过简单地在浏览器中修改javascript来轻松绕过客户端验证检查。此外,客户端可以轻松地将其account_type更新为作者/主持人,因为这是他的数据。 firebase是否提供了解决此问题的方法?

如果不清楚,请告诉我,所以我会进一步详细说明。

感谢。

1 个答案:

答案 0 :(得分:5)

您可以使用安全规则保护您的数据。

Firebase安全规则是基于Firebase服务器上的规则语言的表达式(执行真正评估为真/假)并验证当前用户是否可以访问您的数据。

采用以下数据结构:

{
  // the users of the app
  "users": {
    "1": {
      "name": "Sanjay",
      "isProfileCompleted": true
    },
    "2": {
      "name": "David",
      "isProfileCompleted": false
    }
  }
}

默认情况下,任何人都可以读取或写入Firebase数据库的数据。要解决此问题,您可以编写安全规则。

安全规则本质上是对数据结构的注释:

{
  "rules": {
     "users": { // /users is read only
       ".read": true,
       ".write": false
     }
   }
}

安全规则允许您访问一组服务器变量以检查您的规则。最常用的是auth变量,它允许您检查当前已验证的用户。您还可以使用$创建通配符变量,该变量用作创建路径参数。

{
  "rules": {
    "users": {
      // users can read and write their own data, but no one else. 
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
      }
    }
  }
}

您甚至可以编写规则来验证数据结构。

{
  "rules": {
    "users": {
      // users can read and write their own data, but no one else. 
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid",
        ".validate": "newData.hasChildren(['name', 'isProfileCompleted']),
          "name": {
            ".validate": "newData.isString()"
          },
          "isProfileCompleted": {
             ".validate": "newData.isBoolean()"
           }
      }
    }
  }
}

但是Bolt compiler is a better solution for this,因为它允许你创建类型来定义模式。

您可以在Firebase应用控制台中编写安全规则,也可以通过Firebase CLI上传。