Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在firebase实时数据库中安全设置新用户的组字段_Javascript_Firebase_Firebase Realtime Database_Firebase Authentication - Fatal编程技术网

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
时可能尚未设置该用户名。这就是为什么我们只更新用户数据库节点的
规则
属性,而不是完全设置它