【发布时间】:2019-06-01 15:59:37
【问题描述】:
我有一个使用 firebase firestore 的服务器端渲染 reactjs 应用程序。
我的网站有一个区域用于服务器端呈现需要从 Firestore 检索的内容。
目前,我正在使用 firestore 规则来允许任何人从这些特定文档中读取数据
让我担心的是,一些坏人可能会设置一个脚本来不断地读取我的数据库并累积我的账单(因为我们是按每次读取收费的,似乎让任何人执行读取都是不明智的。)
现行规则
// Allow anonymous users to read feeds
match /landingPageFeeds/{pageId}/feeds/newsFeed {
allow read: if true;
}
最好的前进方式?
如何允许我的服务器端脚本从 Firestore 读取,但不允许其他人这样做?
请记住,这是一个初始操作,它先在服务器端运行,然后再将客户端与预加载状态结合起来。此功能/操作也与客户端共享以进行页面到页面导航。
我考虑过匿名登录 - 这很有效,但是,这会在每次页面加载时生成一个新的匿名用户 - 而且 Firebase 确实会限制新的电子邮件/密码和匿名用户帐户。这似乎不实用。
【问题讨论】:
-
匿名身份验证不会在每次页面加载时创建新用户,除非您对其进行编码。在页面加载之间甚至在浏览器启动之间会记住创建的用户 - 您只需检查是否是这种情况。这是一个常见的错误。
-
还请记住,如果您的页面加载导致从数据库读取,那么不良行为者所要做的就是重复重新加载您的页面以引起不必要的读取。你并没有真正解决问题,你只是在改变它。底线是,如果您公开公开项目的任何服务,您并不能真正阻止人们对您的项目产生费用。
-
匿名用户账户的创建是在服务器端的初始动作上运行的,立即与匿名用户一起读取数据,保存到状态,然后将这个预加载的状态通过水合物发送给客户端的初始加载,每次我重新加载时它都会创建一个匿名用户,我很惊讶客户端 SDK 的这一部分在服务器端工作。 (我为新用户设置设置电子邮件通知)。通过这种方法(firebase.google.com/docs/auth/web/anonymous-auth)所以每次刷新都会发生这种情况。我猜因为限制是基于 IP 的,所以这不是问题吗?
-
我打算尝试通过服务器端缓存来解决这个问题——这样点击重新加载的人只会得到缓存的响应(初始操作不会再次运行)。我更担心第三方机器人会嗅探不安全的 Firestore 数据库。
-
安全规则不会影响来自 Admin SDK 的访问,后者用于运行服务器端代码以访问 Firebase 项目。
标签: reactjs firebase firebase-authentication google-cloud-firestore server-side-rendering