【问题标题】:firebase javascript injectionfirebase javascript注入
【发布时间】:2016-07-21 23:58:56
【问题描述】:

我想问一些关于 Firebase 安全的问题。以下情况如何处理?

  1. 用户正在使用createUserWithEmailAndPassword() 函数创建帐户,然后我将他的用户名、电子邮件、created_at...保存到实时数据库。但是如果数据没有正确保存怎么办。他的帐户已创建并自动登录,但未存储数据。

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

【问题讨论】:

    标签: javascript firebase firebase-realtime-database firebase-authentication


    【解决方案1】:

    情况一:

    根据 firebase 文档 (https://www.firebase.com/docs/web/api/firebase/createuser.html),创建用户不会自动对其进行身份验证。首先需要额外调用authWithPassword()。为了确保用户在没有有效数据的情况下不会通过身份验证,您可以在验证之前对服务器运行检查以确保数据正确保存。

    编辑:没关系;看起来 firebase 现在会进行自动身份验证 - 看看我在下面写的内容。

    现在,这种方法的一个问题是,如果您的应用允许人们使用像 gmail 这样的 OAuth 提供者进行身份验证,那么在对他们进行身份验证之前就没有创建用户的功能。您可能需要做的是从 Firebase 中提取用户数据,确定其是否有效,如果无效则显示一个弹出窗口或重定向,让用户修复任何无效数据。

    情况二:

    如果您想确保在他们从控制台调用 createUserWithEmailAndPassword() 的情况下不会创建新用户,您可以使用 promises 尝试类似的操作;

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

    通过这种方式,您永远不会公开创建新用户的实际代码,因为它存在于匿名函数中。

    我认为这不能完全解决问题,因为 firebases API 可以让任何人使用某些东西创建帐户

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

    (取自https://www.firebase.com/docs/web/api/firebase/createuser.html

    如果您想确保服务器端永远不能创建具有相同用户名的用户,则需要查看 firebases 的规则,特别是 .validate

    使用它,您可以确保用户名不存在,以验证为帐户创建用户名的操作。

    这是关于规则的 firebase 文档:https://www.firebase.com/docs/security/quickstart.html

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

    【讨论】:

    • 您的链接指向旧文档 ... v3 firebase.google.com/docs/reference/js/… "成功创建用户帐户后,此用户也将登录到您的应用程序。"
    • 谢谢。我有一段时间没用过firebase了。
    【解决方案2】:

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

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

    将用户信息添加到实时数据库后,创建一个新用户:

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

    当在实时数据库中插入数据时发生错误,它会跳过 createuser 函数。 这对我来说很好,希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 2017-07-19
      相关资源
      最近更新 更多