我正在使用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;
}
}
}
我的数据库的结构如下:
/ consumers / {consumer_id} / transactions / {transaction_id}
{consumer_id}将包含该消费者的帐户余额以及其他详细信息,而{transaction_id}将包含有关每笔交易的详细信息。
因此,如果任何经过身份验证的用户想要说,可以使用android应用程序/ Web应用程序提取资金。问题是,同一用户是否可以在我不知情的情况下使用其具有REST端点的凭据访问数据库(例如,更新其帐户余额)?如果是这样,我如何防止他们这样做?
答案 0 :(得分:3)
无法将访问Firestore的权限限制为仅使用您的应用的用户。拥有Firebase项目的配置数据的任何人都可以调用该项目中的API。并且,一旦您发布应用程序,就将与这些用户共享配置数据。因此,您必须假设某些恶意用户有时会在不使用您的应用程序的情况下调用项目上的API。
由于这个原因,您应该强制执行在可信环境中拥有的所有业务规则,例如开发机器,您控制的服务器,Cloud Functions或...服务器端安全规则。由于没有用户可以访问其中任何一个,即使他们运行自己的代码,也将被迫遵守您的业务规则。
一些例子:
每个交易文档可能包含正在发布该交易的用户的UID,当然,用户应该只能使用自己的UID来发布交易。您可以使用以下类似的规则在安全规则中强制执行此操作:
dispose
因此,现在任何人(无论他们是否使用您的应用程序)都只能在该文档包含自己的UID的情况下发布交易。您可能需要更多验证,例如是否为他们提供了帐户凭证,也许您是否已经以某种方式验证了他们的帐户。所有这些通常都可以通过服务器端安全规则来完成。
有关此的更多信息,请参见documentation on accessing other documents in security rules,专业系列video on building secure apps和此video on security rules。
由于每个帐户的余额都保留在match /databases/{database}/documents {
match /consumers/{consumer_id}/transactions/{transaction_id}/ {
allow write: if request.resource.data.posted_by == request.auth.uid;
}
}
下的上级文档中,因此每当有交易记录在该文档下时,您都需要更新该文档。尽管可以从安全规则内做到这一点,但它会涉及很多。在服务器端代码中执行余额的此更新将更加容易。
一个好的解决方案是运行将余额更新为Cloud Function的代码,该代码在创建交易时触发(和/或在允许的情况下进行更新)。由于此代码在受信任的环境中运行,因此您可以确保只有您才能对其进行修改,从而可以安全地更新新交易/修改过的交易的余额。