Firestore规则必须有多严格?

时间:2018-05-05 09:18:41

标签: google-cloud-firestore firebase-security-rules

我可以信任Firestore中的数据,还是我必须检查所有内容并且绝对不信任传入的数据,因为客户端可以伪造所有内容?

例如,客户端可以伪造uid,电子邮件和显示名称吗?

firebase.firestore().collection("users").doc(state.user.uid).collection("friendRequests").doc(payload.uid).set({
  uid: payload.uid,
  email: payload.email,
  displayName: payload.displayName
});

Firestore规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
    }
    match /users/{userId} {
        allow read, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid != null;
    }
    match /users/{userId}/friendRequests/{friendId} {
      allow create: if userId == request.auth.uid
      && friendId != request.auth.uid
      && !exists(/databases/$(database)/documents/users/$(request.auth.uid)/friends/$(friendId))
      && !exists(/databases/$(database)/documents/users/$(request.auth.uid)/friendRequests/$(friendId))
      && !exists(/databases/$(database)/documents/users/$(friendId)/friends/$(request.auth.uid))
      && !exists(/databases/$(database)/documents/users/$(friendId)/friendRequests/$(request.auth.uid));
    }
  }
}

一套规则已经很大了,如果数据结构有效并且朋友uid存在,我甚至还没检查。

1 个答案:

答案 0 :(得分:0)

安全规则中的request.auth由Firebase身份验证填充。这意味着触发规则的用户必须已使用Firebase身份验证登录,并且request.auth中的个人资料属于登录的用户。

有人可以劫持该流程的唯一方法是,他们是否可以访问您项目的管理凭据。有了它,他们可以生成他们想要的任何令牌。但如果发生这种情况,他们可以无限制地访问您的数据库,因此伪造令牌的额外步骤是无用的。

当然,当使用社交提供商(Facebook,Github,Google等)时,用户可以设置他们想要的任何显示名称。所以除了使用它来显示每个用户的名称之外,你通常不应该依赖它是有效的。