firebase - Firebase - 防止恶意用户提取整个数据库
问题描述
我正在观看 Firebase 文档视频并注意到在此视频中:https ://www.youtube.com/watch?v=9sOT5VOflvQ&list=PLl-K7zZEsYLn8h1NyU_OV6dX8mBhH2s_L&index=4
在 6:39,Doug 提到可以通过执行以下操作来限制一个查询返回的文档数量:
allow list if: request.query.limit <= 20
然而,他提到,虽然这样做是有益的,因为它可以防止您意外执行一组非常昂贵的读取操作,但它仍然无法阻止恶意用户通过发出多个请求并使用分页来筛选您的数据库来读取您数据库中的所有内容. 我可以在 JavaScript 中设想某种无限的 while 循环,这使得这非常有问题且代价高昂。
我能想到解决这个问题的唯一方法可能是通过某种方式使用时间戳,并保存一些与每个用户相关的信息,这些信息会通知数据库他们上次发出请求的时间。是否可以这样做,然后访问安全规则中的那些时间戳?类似于(其中第二个条件是一种伪代码):
allow list if: request.query.limit <= 20 && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.last-time <= 100
在我看来,这似乎是最可行的方法,但如果其他人对此有想法,他们将不胜感激!
解决方案
last-time
问题是发生此查询时您无法更新。而且由于您无法last-time
在他们阅读时进行更新,因此无法限制用户可以通过此机制执行的阅读次数。
由于这个限制,可以在安全规则中实现写入速率限制,但不能实现读取速率限制。
推荐阅读
- wpf - 为什么依赖属性不能在用户控件中使用?
- hyperledger-composer - failed to install composer-cli but I see errors
- android - 我的按钮代码在 Android Studio 中不断给我错误
- eclipse - 如何在 MyEclipse 中手动安装 IvyDE?
- reactjs - React 类组件具有属性,但 Typescript 说它没有
- arduino - 调用 void 函数 arduino
- jenkins - 如何检查谁杀死了 Jenkins Job
- algorithm - Prove that a subgraph is a minimum spanning tree
- .net - 如何在 web api 中处理重复的帖子请求
- java - 移动设备上符合 JAX-RS 的实现