Javascript 在firebase实时数据库中安全设置新用户的组字段
我尝试只设置一次新创建用户的“组”字段,方法是在成功注册后执行此操作:Javascript 在firebase实时数据库中安全设置新用户的组字段,javascript,firebase,firebase-realtime-database,firebase-authentication,Javascript,Firebase,Firebase Realtime Database,Firebase Authentication,我尝试只设置一次新创建用户的“组”字段,方法是在成功注册后执行此操作: this.props.firebase .makeUserWithEmailAndPassword(email, password) .then((authUser) => { return this.props.firebase.user(authUser.user.uid).set({ username, email, rule: 'USER' });
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
角色,并且只有特定的用户才能获得一个特殊的角色。您可以编写数据访问代码,假设规则==“USER”
(如果未指定),也可以使用受信任的环境设置初始角色
一个受信任的环境,例如您的开发机器、您控制的服务器或云功能,是您可以确保运行的代码就是您编写的代码的地方。在这种情况下,我认为云功能是最合适的,因为它允许您这样做。根据该文档,您可以使用以下内容将新用户标记为用户
:
exports.setDefaultRole = functions.auth.user().onCreate((user) => {
return admin.database().ref("users").child(user.uid).update({ rule: "USER" });
});
您会注意到,我们无法访问此代码中的
用户名,因为在运行此onCreate
时可能尚未设置该用户名。这就是为什么我们只更新用户数据库节点的规则
属性,而不是完全设置它。从客户端执行此操作确实不安全。鉴于您的应用程序包含调用Firebase API所需的所有配置数据,任何恶意用户都可以复制此配置数据并自行调用API
所以他们可以这样做:
await this.auth.createUserWithEmailAndPassword(email, password);
this.props.firebase.user(authUser.user.uid).set({
username,
email,
rule: 'ADMIN'
});
这可能不是你想要的。出于这个原因,您永远不应该相信您的代码正在访问您的数据库,并且始终注意那些会针对您的数据库和API编写自己代码的恶意用户
听起来,在创建用户时,应该假定他们有一个常规的USER
角色,并且只有特定的用户才能获得一个特殊的角色。您可以编写数据访问代码,假设规则==“USER”
(如果未指定),也可以使用受信任的环境设置初始角色
一个受信任的环境,例如您的开发机器、您控制的服务器或云功能,是您可以确保运行的代码就是您编写的代码的地方。在这种情况下,我认为云功能是最合适的,因为它允许您这样做。根据该文档,您可以使用以下内容将新用户标记为用户
:
exports.setDefaultRole = functions.auth.user().onCreate((user) => {
return admin.database().ref("users").child(user.uid).update({ rule: "USER" });
});
您会注意到,我们无法访问此代码中的用户名,因为在运行此onCreate
时可能尚未设置该用户名。这就是为什么我们只更新用户数据库节点的规则
属性,而不是完全设置它