0 firebase firebase-security firebase-authentication google-cloud-firestore
我正在使用 firebase cloud firestore 开发银行应用程序。我已经设置了这样的规则:
// Allow read/write access on all documents to any user signed in to the application
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid != null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的数据库结构如下:
/consumers/{consumer_id}/transactions/{transaction_id}
{consumer_id} 将包含该消费者的帐户余额以及其他详细信息,而 {transaction_id} 将包含有关每笔交易的详细信息。
因此,如果任何经过身份验证的用户想要提款,他们可以使用 android 应用程序/Web 应用程序进行提取。问题是,同一用户是否可以在我不知情的情况下使用他们的凭据和 REST 端点访问数据库(例如:更新他们的帐户余额)?如果是这样,我如何防止他们这样做?
无法将 Firestore 的访问权限限制为仅使用您的应用的用户。任何拥有 Firebase 项目配置数据的人都可以调用该项目中的 API。一旦您发布了您的应用程序,您就会与这些用户共享配置数据。因此,您必须假设某些恶意用户有时会在不使用您的应用程序的情况下调用您项目上的 API。
出于这个原因,您应该强制执行您在可信环境中拥有的所有业务规则,例如您的开发机器、您控制的服务器、云功能或...服务器端安全规则。由于没有用户可以访问其中任何一个,即使他们运行自己的代码,他们也将被迫遵守您的业务规则。
一些例子:
每个交易文档可能包含发布该交易的用户的 UID,当然用户应该只能使用自己的 UID 发布交易。您可以使用以下内容在安全规则中强制执行此操作:
match /databases/{database}/documents {
match /consumers/{consumer_id}/transactions/{transaction_id}/ {
allow write: if request.resource.data.posted_by == request.auth.uid;
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在任何人(无论他们是否在使用您的应用程序)只能在该文档包含他们自己的 UID 的情况下发布交易。您可能想要多验证一点,例如是否有他们的帐户文件,以及您是否以某种方式验证了他们的帐户。所有这些通常都可以通过服务器端安全规则来完成。
有关这方面的更多信息,请参阅有关访问安全规则中的其他文档的文档、有关构建安全应用程序的专业系列视频以及有关安全规则的此视频。
由于您将每个帐户的余额保存在其下的父文档中/consumers/{consumer_id}
,因此每当在其下过帐交易时,您都需要更新该文档。虽然这在安全规则中是可能的,但它会非常复杂。在服务器端代码中执行此余额更新会更容易。
一个很好的解决方案是运行更新余额的代码作为一个云函数,每当交易被创建(和/或更新,如果你允许)就会被触发。由于此代码在受信任的环境中运行,您可以确定只有您可以修改它,因此它可以安全地更新新/修改交易的余额。
归档时间: |
|
查看次数: |
1479 次 |
最近记录: |