firebase Firestore安全规则:使用request.resource.data.__field__的成本!= resource.data.__field__?

368yc8dk  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(90)

它是昂贵的(例如)。大概有多少次读取&我们以$收取多少费用)来拥有这样的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)
}

字符串

deyfvvtc

deyfvvtc1#

根据文档,您的安全规则中的get()和exists()请求将被计费:
使用get()和exists()函数,安全规则可以根据数据库中的其他文档评估传入的请求。
续:
使用这些函数在数据库中执行读取操作,这意味着即使您的规则拒绝了请求,您也会因阅读文档而收取费用。有关更具体的计费信息,请参阅Cloud Firestore定价。
因此,如果您的规则不使用get()或exists(),那么您就没有与这些规则关联的额外计费。看来你没有使用这些功能在这里,所以我预计没有额外的计费。

8ljdwjyq

8ljdwjyq2#

我刚刚测试了这个简单的安全规则:

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    function isAuthor() {
      return request.auth != null &&
             request.auth.uid == resource.data.author.uuid;
    }
    match /posts/{postId} {
      allow read, write: if isAuthor();
    }
  }
}

字符串
使用模拟的读取操作和“不正确”的UID,我读取了一个文档100次,它被拒绝了100次,它被计入了100次的读取操作,正如你在这个峰值中看到的。
x1c 0d1x的数据
所以,是的,使用resource是昂贵的。无论它被拒绝或通过,它都会计入您的账单,由于Firebase的自然惊人的系统,您会受到账单欺诈的影响。
您需要实施大量的云解决方案来缓解生产中许多用户的这种情况,因为没有直接的解决方案或一种方法来防止此类攻击。

编辑:

官方Firebase Docs表示
资源是服务中的当前值,表示为键值对的Map。在条件中引用resource将导致从服务中最多读取一次值。此查找将计入资源的任何与服务相关的配额。对于get请求,资源只会在拒绝时计入配额。
这意味着,如果您的条件没有引用resource,它将不会被计算在内;更准确地说,如果你的条件没有访问resource字段,它将不会被计数。请记住,即使您访问资源并且您的规则成功,您也只能获得一个读操作最多,而不是前面提到的两个。我们已经测试过了,它只依赖于否认。
(1)这是你的谎言,也是你的谎言。

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false && resource.data
    }
  }
}


(2)这将拒绝**,但将**计入您的读取,因为您访问了resource

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if resource.data.readable; // always false
    }
  }
}


(1)导致0次使用,100个请求被拒绝。
(2)导致100次使用和100次拒绝请求。

这里有一个提示知道你是否会得到一个读操作计费或没有。

规则游戏区:

如果您在右侧看到一个resource,这意味着此规则已经访问了resource,这意味着它向您收取了读取操作的费用。
如:

和(.readable在文档中是false):


如果您在右侧没有看到resource,则意味着此规则没有访问resource,因此没有向您收取读取操作的费用。
例如(resource.data总是true):


参考文献:

  1. https://firebase.google.com/docs/rules/rules-language#basic_structure

相关问题