在应用本身中实现Firebase安全规则有什么问题?

时间:2019-06-12 11:45:14

标签: java android firebase firebase-realtime-database firebase-security-rules

我是Firebase数据库的新手,我无法理解安全规则。

示例规则1:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

以上规则允许所有人读取和写入数据库。

示例规则2:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

上述规则仅允许经过身份验证的用户读取和写入他们自己的数据。

我的问题是,如果我将数据库的安全规则设置为“示例规则1”,并以只有经过身份验证的用户才能读写数据的方式开发应用程序,那怎么了?

在应用本身中实现安全规则有什么问题?

3 个答案:

答案 0 :(得分:3)

  

如果我将数据库的安全规则设置为“示例规则1”,并以仅经过身份验证的用户可以读写数据的方式开发应用程序,那怎么了?

第一个解决方案中的安全规则将验证整个数据库上的读取和写入操作。因此,如果您在Firebase数据库根节点上附加了一个侦听器,它将检查您是否对根节点具有读取权限。由于您已将读/写权限设置为true

{
   "rules": {
     ".read": true,
     ".write": true
   }
}

所有读取和写入操作都将被批准,无论您的代码在应用程序中的样子如何。请注意,即使其他用户不使用您的应用程序,也可以访问您的数据库。

  

在应用本身中实现安全规则有什么问题?

您不能在应用程序中添加安全规则。您可以添加一些约束,但是可以根据某些规则使服务器拒绝操作。

答案 1 :(得分:1)

您必须经历此https://firebase.google.com/docs/database/security/securing-data。 这些规则用于定义数据的安全性。什么类型的数据可以读取以及由谁读取。规则通常遵循您在数据库中使用的数据结构。

{
 "users": {
"users0": {
  "name": "ABC",
   "marks":"75",
  "email": "m@gmail.com"
},
"users1": {
  "name": "XYZ",
  "marks":"30",
  "email": "abc@gmail.com"
},

}
}

为了读取分数超过70的用户的数据,我们可以将规则写为

{
"rules": {
"users": {
  "$user": {
    // only users whose marks greater than 70  can be read
    ".read": "data.child('marks').val() > (70)",

  }
  }
 }
 }

在这种情况下,user只会读取标记大于70的用户数据。

答案 2 :(得分:1)

从应用程序访问Firebase数据库时,您的应用程序包含访问数据库所需的配置信息。对于实时数据库,它是https://yourprojectname.firebaseio.com中的模式google-services.json的URL。应用程序必须包含该信息,以使您的应用程序能够正常工作。没有它,应用程序将不知道要访问哪个数据库。

但这还意味着恶意用户可以从您的应用程序中提取该信息,然后使用它来访问数据库,而无需使用您的应用程序。一旦他们知道了不受保护的数据库的URL,便可以在自己的代码中使用该URL。如果他们的代码不遵循与您的代码相同的规则,则由于没有服务器端安全性规则来强制执行这些规则,因此您的数据将被破坏(或泄露)。

一个非常简单的示例是,他们可以使用Firebase REST API来delete all of your data

curl -X DELETE 'https://yourprojectname.firebaseio.com/.json'

如果您在Firebase的服务器端安全规则中实施逻辑,则恶意用户无法绕过它。即使他们使用您的数据库URL,他们的代码/ REST调用也将根据安全规则进行验证,如果不匹配,则将被拒绝。