0

我想问一些关于firebase安全性的内容。如何处理以下情况?firebase javascript injection

  1. 用户与createUserWithEmailAndPassword()功能创建的帐户,然后我保存他的用户名,电子邮件,created_at ......到实时数据库。但是如果数据没有正确保存会怎么样。他的帐户已创建,他自动登录但数据不存储。

  2. 我有一些注册逻辑...例如唯一的用户名......所以在创建acc之前我检查这个用户名是否存在于实时数据库中。但他仍然可以从js console调用createUserWithEmailandPassword()并创建帐户。

回答

0

对于情况之一:

按照火力文档(https://www.firebase.com/docs/web/api/firebase/createuser.html),创建用户并不会自动验证他们的身份。首先需要额外致电authWithPassword()。为了确保用户在没有有效数据的情况下无法通过身份验证,可以在服务器上运行检查以确保在进行身份验证之前数据已正确保存。

编辑:没关系,看起来像firebase现在自动认证 - 看看我在下面写了什么。

现在,如果您的应用允许用户使用Gmail等OAuth提供程序进行身份验证,那么在使用此方法时,将无法在验证身份之前创建用户。您可能需要做的是从Firebase中提取用户数据,确定它是否有效,以及它是否无效,并显示允许用户修复任何无效数据的弹出窗口或重定向。

对于情况二:

如果你想确保在他们不创建一个新的用户,你可以尝试这样的事情与承诺控制台呼叫createUserWithEmailAndPassword()的情况;

var createUserWithEmailAndPassword = function(username, password) { 
    var promise = isNewUserValid(username, password); 
    promise.then(function() { 
     // Code for creating new user goes here 
    }); 
} 

这样,你永远不暴露的实际代码,使一个新的用户,因为它的匿名函数中存在。

我不认为这会完全解决问题,但因为火力点API将让任何人使用的东西创建一个帐户

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com"); 
ref.createUser({ 
    email: "[email protected]", 
    password: "correcthorsebatterystaple" 
} 

(来自https://www.firebase.com/docs/web/api/firebase/createuser.html两者)​​

如果你想确保服务器端你不能创建一个用户名相同的用户,你需要看看firebase的规则,特别是.validate

使用它,你可以确保用户名不alre ady的存在是为了验证为帐户创建用户名的操作。

下面是关于规则的火力DOC:https://www.firebase.com/docs/security/quickstart.html

这是堆栈溢出的另一个问题是非常相似你的。 Enforcing unique usernames with Firebase simplelogin Marein的答案是实现服务器端验证的一个很好的起点。

+0

您的链接指向旧文档... v3 https://firebase.google.com/docs/reference/js/firebase.auth.Auth#createUserWithEmailAndPassword“成功创建用户帐户时,此用户也将登录到您的应用程序。“ –

+0

谢谢。我有一段时间没有使用Firebase。 – Davis

0

首先保存在实时数据库中的用户凭据创建用户之前:

firebase.auth().createUserWithEmailAndPassword(useremail, userpassword).catch(function(error) { 
     // Handle Errors here. 
     var errorCode = error.code; 
     var errorMessage = error.message; 
     // ... 
    }); 

当发生错误:

var rootRef = firebase.database().ref('child'); 

    var newUser = { 
     [name]: username, 
     [email]: useremail, 
     [joined]: date 
    }; 
    rootRef.update(newUser); 

加入Usersinfo到实时数据库中创建一个新用户后在将数据插入实时数据库时,它将跳过createuser函数。 这对我来说很好,希望这有助于!