我有一个SwiftUI应用程序,它使用Firebase作为后端,我的规则如下:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// This rule allows anyone on the internet to view, edit, and delete
// all data in your Firestore database. It is useful for getting
// started, but it is configured to expire after 30 days because it
// leaves your app open to attackers. At that time, all client
// requests to your Firestore database will be denied.
//
// Make sure to write security rules for your app before that time, or else
// your app will lose access to your Firestore database
match /{document=**} {
allow read, write: if request.time < timestamp.date(2020, 10, 28);
}
}
}
我了解这些规则允许任何人读取和写入数据库。但是,只要他们仅使用应用程序中提供给他们的API ,这怎么不安全?例如,如果有人从我的笔记本电脑上拿走了xcode项目并创建了一个删除数据库中所有用户的按钮,我就可以理解这种危险。但是,没有人可以访问此代码。
我确实希望用户能够读写数据库,因此我只是想知道这些规则是否不安全,如果可以,为什么?就像一个示例,该示例说明了具有恶意的黑客如何利用这些规则来获取未经授权的用户信息访问权限和/或以某种方式修改数据库,而该方式不允许我的应用程序中提供的API?
谢谢。
答案 0 :(得分:1)
只要他们仅使用应用程序中提供给他们的API
这正是问题所在。
您的应用程序包含连接到数据库(以及Firebase项目中的其他资源)所需的所有配置。恶意用户可以获取此配置数据,然后自己调用API,从而绕过您的任何客户端逻辑。
当前无法确保对数据库的访问来自您的代码,而不是其他人的代码与您的配置数据一起访问。
这就是为什么在安全规则中也编码业务逻辑至关重要的原因。假设您的应用程序代码仅允许用户从数据库中删除自己的帐户,然后您还希望在安全规则中对该逻辑进行编码,以便在服务器上强制执行。这是Firebase有关保护数据库的文档描述为content-owner only access的变体。