javascript - 在 Firestore 客户端更新和添加这个新文档是否安全?
问题描述
我对在这种情况下应该使用 Cloud Function 还是将其保留在客户端感到困惑。我正在做一个交易(更新+设置)。这安全吗?一个坏演员真的会对我在数据库中的数据造成伤害吗?我知道我必须设置 Firestore 规则以仅允许经过身份验证的用户,但经过身份验证的不良行为者仍然可以滥用它,对吗?
const refA = firestore().collection('discounts').doc(this.getSelected.discount_id);
const refB = firestore().collection('discount_reservations').doc();
const updateFunction = async transaction => {
const [disc_amountt] = await Promise.all([
transaction.get(refA),
]);
const disc_amount = disc_amountt.data().am; //getting amount field
const decrement = firestore.FieldValue.increment(-(this.state.selected_amount));
const selected_am = this.state.selected_amount;
//update
transaction.update(refA, {
am: decrement,
});
transaction.set(refB, {
uID: '1',
dID: this.getSelected.discount_id,
aR: this.state.selected_amount
});
};
// run the transaction
firestore().runTransaction(updateFunction)
.then(result => {
//.....
})
如果这足够安全,那么在 Function 中执行它会提高应用程序的性能吗?
任何建议都非常感谢!
更新
我试图阻止的一个示例场景:
这是我案例的一个示例场景:有两个集合,“discounts”和“discount_reservations”。当用户想要预订折扣时,我首先检查“折扣”集合中是否有任何折扣,如果有,那么我将在“discount_reservations”中创建一个包含用户选择的折扣金额的文档。现在,问题是,如果一个坏演员试图在“discount_reservations”集合中创建一个文档,即使“折扣”集合中没有折扣?!我可以使用安全规则来防止这种情况吗?
解决方案
您的安全规则应该只允许您希望允许对您的数据进行的操作。如果您注意制定安全规则,则可以仅使用安全规则来保护应用程序的大部分。
本质上:您将在客户端代码和服务器端安全规则之间复制一些业务逻辑。您需要在客户端代码中包含逻辑,因为这有助于用户向数据库提交正确的数据。但是你也必须在服务器端的安全规则中有它,因为你不能相信所有的操作都来自你自己的代码。
在实践中,许多开发人员发现很难开始使用安全规则,因此他们在 Cloud Functions 或其他服务器端 API 中实现其后端功能。这是一种有效的方法,但这只是意味着您现在正在客户端代码和服务器端代码之间复制业务逻辑。这可能更熟悉,因为现在双方都是常规代码(在您的情况下,甚至都在 JavaScript 中),但您仍然在复制客户端和服务器之间的逻辑。
因此,您必须在更熟悉的“运行服务器端代码以确保数据正确且用户被授权”的范式与具有安全规则的模型之间做出权衡。两者都可以用来保护几乎任何场景,我经常在大型项目中看到两者的混合。
推荐阅读
- sql - 根据多个条件选择行
- flutter - 如何显示大图像的一部分?
- python - __getattr__(self, name) 中的 site-packages\pandas\core\generic.py 中的属性错误是什么
- mysql - 仅选择多个结果集中的那些行
- tfs - 如何获取代理中 _work 文件夹中的文件夹数量?
- mysql - 有没有办法在给定事件发生一次后为某个范围内的每个日期自动填充 YES?
- c++ - 使用基类指针调用基类的值构造函数的语法是什么?
- python - Odoo,如何在自定义模块中从供应商信息中获取供应商价格值?
- c# - 连接 VPN 时 Visual Studio 2019 调试不起作用
- javascript - 为什么轨道数据库数据没有保存在全球网络上