在firebase实时数据库中安全设置新用户的组字段



我正在尝试设置;组";新创建的用户的字段只有一次,只有在成功注册后才会发生:

this.props.firebase
.makeUserWithEmailAndPassword(email, password)
.then((authUser) => {
return this.props.firebase.user(authUser.user.uid).set({
username,
email,
rule: 'USER'
});
})

firebase道具就是这个类的实例:

class Firebase 
{
constructor() 
{
app.initializeApp(config);
this.auth = app.auth();
this.db = app.database();
}
makeUserWithEmailAndPassword = (email, password) =>
this.auth.createUserWithEmailAndPassword(email, password);

但是,当它只由检查字段是否尚未设置的规则来保护时,初始化是否安全?难道有人不能在这个代码运行之前注入将其设置为其他内容的代码吗?

从客户端执行此操作确实不安全。假设您的应用程序包含调用Firebase API所需的所有配置数据,任何恶意用户都可以复制此配置数据并自己调用API。

所以他们可以这样做:

await this.auth.createUserWithEmailAndPassword(email, password);
this.props.firebase.user(authUser.user.uid).set({
username,
email,
rule: 'ADMIN'
});

这可能不是你想要的。因此,您永远不应该相信您的代码正在访问您的数据库,并始终注意那些会针对您的数据库和API编写自己的代码的恶意用户。

听起来应该假设用户在创建时具有常规的USER角色,并且只有特定用户才能获得特殊角色。如果没有指定rule == 'USER',您可以编写数据访问代码以假设它,也可以使用受信任的环境来设置初始角色。

一个可信的环境,比如你的开发机器、你控制的服务器或云功能,是一个你可以确保运行的代码是你写的代码的地方。在这种情况下,我认为云功能非常适合,因为它允许你在谷歌的服务器上自动运行代码,以响应创建的用户帐户。根据该文档,您可以使用将新用户标记为USER

exports.setDefaultRole = functions.auth.user().onCreate((user) => {
return admin.database().ref("users").child(user.uid).update({ rule: "USER" });
});

您会注意到,我们无法访问此代码中的username,因为在运行此onCreate时可能尚未设置。这就是为什么我们只更新用户数据库节点的rule属性,而不是完全设置它。

最新更新