Java 在应用程序本身中实施Firebase安全规则有什么问题?

Java 在应用程序本身中实施Firebase安全规则有什么问题?,java,android,firebase,firebase-realtime-database,firebase-security,Java,Android,Firebase,Firebase Realtime Database,Firebase Security,我是Firebase数据库的新手,在理解安全规则方面有困难 示例规则1: { "rules": { ".read": true, ".write": true } } 上面的规则允许每个人读写数据库 示例规则2: { "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" }

我是Firebase数据库的新手,在理解安全规则方面有困难

示例规则1:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}
上面的规则允许每个人读写数据库

示例规则2:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}
上述规则只允许经过身份验证的用户读取和写入他们自己的数据

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

在应用程序本身中实施安全规则有什么问题

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

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

无论您的代码在应用程序中看起来如何,所有读写操作都将获得批准。请注意,任何其他用户都可以访问您的数据库,即使他们不使用您的应用程序

在应用程序本身中实施安全规则有什么问题

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

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

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

无论您的代码在应用程序中看起来如何,所有读写操作都将获得批准。请注意,任何其他用户都可以访问您的数据库,即使他们不使用您的应用程序

在应用程序本身中实施安全规则有什么问题

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

您必须完成此操作。 这些规则用于定义数据的安全性。什么类型的数据可以读取,由谁读取。规则通常遵循您在数据库中使用的数据结构

{
 "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)",

  }
  }
 }
 }
在这种情况下,用户将仅读取其标记高于70的用户数据

你必须经历这一切。 这些规则用于定义数据的安全性。什么类型的数据可以读取,由谁读取。规则通常遵循您在数据库中使用的数据结构

{
 "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)",

  }
  }
 }
 }

在这种情况下,用户将仅读取其标记高于70的用户数据

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

但这也意味着恶意用户可以从你的应用程序中提取该信息,并在不使用你的应用程序的情况下使用该信息访问数据库。一旦他们知道您未受保护的数据库的URL,他们就可以在自己的代码中使用该URL。如果他们的代码与您的代码不遵循相同的规则,您的数据将被破坏或泄露,因为没有服务器端安全规则来强制执行这些规则

一个非常简单的例子是,他们可以使用Firebase REST API来实现


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

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

但这也意味着恶意用户可以从你的应用程序中提取该信息,并使用该信息访问da tabase而不使用您的应用程序。一旦他们知道您未受保护的数据库的URL,他们就可以在自己的代码中使用该URL。如果他们的代码与您的代码不遵循相同的规则,您的数据将被破坏或泄露,因为没有服务器端安全规则来强制执行这些规则

一个非常简单的例子是,他们可以使用Firebase REST API来实现


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

我知道。但是,我们可以在我们的应用程序中使用代码来实现同样的功能,对吗?我想我们必须这样做。那么,把它写成安全规则有什么意义呢?是的,我们可以做到。但最好的做法是不要在类中编写太多代码。要么把它们放在单独的文件里,要么你可以把它们写在firebase里。我知道。但是,我们可以在我们的应用程序中使用代码来实现同样的功能,对吗?我想我们必须这样做。那么,把它写成安全规则有什么意义呢?是的,我们可以做到。但最好的做法是不要在类中编写太多代码。可以将它们放在单独的文件中,也可以将它们写在firebase中。我不是指在应用程序中添加安全规则。我的意思是,即使我的安全规则是示例规则1,我也可以按照示例规则2中的规则构建应用程序,对吗?不,你不能这么做!即使您以100%编程方式保护您的应用程序,如果您使用示例1中的安全规则,其他应用程序或用户也可以访问您的数据库。因此,我强烈建议您使用第二种解决方案来保护您的数据库,这样只有经过身份验证的用户才能访问它。@eegooDeveloper客户机-服务器解决方案的首要规则是永远不要信任客户机。您可以在客户机中设置检查限制向用户显示的选项,或者警告他们不接触服务器就无法执行操作,但服务器必须始终监控其收到的任何请求。否则,有人可以在没有这些检查的情况下编写自己的客户端,或者通过黑客攻击你的客户端来绕过它们。我不是指在应用程序中添加安全规则。我的意思是,即使我的安全规则是示例规则1,我也可以按照示例规则2中的规则构建应用程序,对吗?不,你不能这么做!即使您以100%编程方式保护您的应用程序,如果您使用示例1中的安全规则,其他应用程序或用户也可以访问您的数据库。因此,我强烈建议您使用第二种解决方案来保护您的数据库,这样只有经过身份验证的用户才能访问它。@eegooDeveloper客户机-服务器解决方案的首要规则是永远不要信任客户机。您可以在客户机中设置检查限制向用户显示的选项,或者警告他们不接触服务器就无法执行操作,但服务器必须始终监控其收到的任何请求。否则,有人可能在没有这些检查的情况下编写自己的客户机,或者攻击您的客户机以绕过这些检查。