0

我的前端 Web 代码中嵌入了一个函数,用于接受经过身份验证的用户的订单。一个好奇的用户决定检查我的网络代码并了解这个功能。因此,他在我的数据库中找到了存储订单的位置,以及经过身份验证的用户有权写入该集合。他决定向收集订单发送垃圾邮件,并用成人信息填充我的数据库。我怎么能阻止呢?

    orderButton.addEventListener('click', (e)=>{
        db.collection('orders').add({item: e.target.id, buyer: user.uid})
    })

我应该在后端执行云功能来检查有效性还是限制每小时的订单。如果是这样,为什么我不应该首先在后端编写订单函数,然后从前端调用?

Firebase 为后端云功能收取额外费用,所以我想知道有什么方法可以节省成本并在前端发挥所有魔力?

4

2 回答 2

1

也许您可以添加私有令牌来解决它。我认为解决问题的最佳方法是将函数放在后端并从前端调用它。

于 2020-03-15T14:47:03.150 回答
1

从客户端直接写入数据库是 Firebase 的功能之一,但它不能只用于所有方面。它的最佳应用是,例如,让用户更改自己的描述、个人资料图片或编辑自己的博客文章。不能伤害别人的东西。您应该编写足够的安全规则来消除任何可能滥用此功能的情况,例如,您不让用户编辑其他用户的博客文章

orders永远不应该拥有一个每个用户(甚至经过身份验证)都可以写入的集合。如果您让用户在orders数据库中创建订单,则没有什么可以阻止任何用户使用虚假订单向该数据库发送垃圾邮件,或者从其他用户的名称创建订单(通过在buyer字段中输入任何其他 id)。您不能信任该集合中的数据

这不是在您的客户端代码中公开某人可以阅读的功能,而是更多关于拥有甚至允许这种操作的安全规则

总结和回答您的问题,有时可以让用户在适当设计的安全规则下直接写入数据库,但在您的场景中并非如此。如果您希望orders集合是可信任的,则应从服务器端对其进行管理

于 2020-03-15T15:03:48.283 回答