它是昂贵的(例如)。大概有多少次读取&我们以$收取多少费用)来拥有这样的firestore安全性:
match /profiles/{document=**} {
allow create: if request.auth.uid != null
&& (request.resource.data.firstName is string && resource.data.firstName != request.resource.data.firstName)
&& (request.resource.data.lastName is string && resource.data.firstName != request.resource.data.firstName)
&& (request.resource.data.username is string && resource.data.username != request.resource.data.username)
&& (request.resource.data.email is string && resource.data.email != request.resource.data.email)
}
字符串
2条答案
按热度按时间deyfvvtc1#
根据文档,您的安全规则中的get()和exists()请求将被计费:
使用get()和exists()函数,安全规则可以根据数据库中的其他文档评估传入的请求。
续:
使用这些函数在数据库中执行读取操作,这意味着即使您的规则拒绝了请求,您也会因阅读文档而收取费用。有关更具体的计费信息,请参阅Cloud Firestore定价。
因此,如果您的规则不使用get()或exists(),那么您就没有与这些规则关联的额外计费。看来你没有使用这些功能在这里,所以我预计没有额外的计费。
8ljdwjyq2#
我刚刚测试了这个简单的安全规则:
字符串
使用模拟的读取操作和“不正确”的UID,我读取了一个文档100次,它被拒绝了100次,它被计入了100次的读取操作,正如你在这个峰值中看到的。
x1c 0d1x的数据
所以,是的,使用
resource
是昂贵的。无论它被拒绝或通过,它都会计入您的账单,由于Firebase的自然惊人的系统,您会受到账单欺诈的影响。您需要实施大量的云解决方案来缓解生产中许多用户的这种情况,因为没有直接的解决方案或一种方法来防止此类攻击。
编辑:
官方Firebase Docs表示
资源是服务中的当前值,表示为键值对的Map。在条件中引用
resource
将导致从服务中最多读取一次值。此查找将计入资源的任何与服务相关的配额。对于get请求,资源只会在拒绝时计入配额。这意味着,如果您的条件没有引用
resource
,它将不会被计算在内;更准确地说,如果你的条件没有访问resource
字段,它将不会被计数。请记住,即使您访问资源并且您的规则成功,您也只能获得一个读操作最多,而不是前面提到的两个。我们已经测试过了,它只依赖于否认。(1)这是你的谎言,也是你的谎言。
型
(2)这将拒绝**,但将**计入您的读取,因为您访问了
resource
。型
(1)导致0次使用,100个请求被拒绝。
(2)导致100次使用和100次拒绝请求。
这里有一个提示知道你是否会得到一个读操作计费或没有。
规则游戏区:
如果您在右侧看到一个
resource
,这意味着此规则已经访问了resource
,这意味着它向您收取了读取操作的费用。如:
和(
.readable
在文档中是false
):的
如果您在右侧没有看到
resource
,则意味着此规则没有访问resource
,因此没有向您收取读取操作的费用。例如(
resource.data
总是true
):的
参考文献: