我可以信任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存在,我甚至还没检查。
答案 0 :(得分:0)
安全规则中的request.auth
由Firebase身份验证填充。这意味着触发规则的用户必须已使用Firebase身份验证登录,并且request.auth
中的个人资料属于登录的用户。
有人可以劫持该流程的唯一方法是,他们是否可以访问您项目的管理凭据。有了它,他们可以生成他们想要的任何令牌。但如果发生这种情况,他们可以无限制地访问您的数据库,因此伪造令牌的额外步骤是无用的。
当然,当使用社交提供商(Facebook,Github,Google等)时,用户可以设置他们想要的任何显示名称。所以除了使用它来显示每个用户的名称之外,你通常不应该依赖它是有效的。