javascript - 如何确保我的数据在 Firebase 登录之前和之后都经过清理?

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

情况:

我正在尝试清理用户登录时输入的数据。

清理工作应在服务器端完成,但 Firebase 登录必须在客户端上完成。

我的想法如下:发出 ajax 请求来清理数据,然后使用清理后的数据登录。

然后发出第二个ajax请求,将某些登录信息写入数据库(这是必要的,但与登录本身没有直接关系,但必须在登录后立即完成)。

<小时/>

问题:

我遇到的问题如下:

我询问了安全堆栈交换,他们告诉我第一个 ajax 请求基本上没有用,因为它很容易被绕过。

这意味着用户可以输入未经验证的数据,并且该数据将被传递到登录 Firebase 功能的电子邮件和密码字段。

我可以将清理代码移至第二个 ajax 请求并删除第一个请求,以便清理我写入数据库的所有数据,但我不知道如何处理登录功能字段。

此外,第一个 ajax 请求会检查验证码。

<小时/>

问题:

如何确保所有数据都经过清理,并且以不允许绕过该检查的方式正确验证了验证码?

   $("#loginForm").submit(function(e) {

    e.preventDefault(); 
    var email = $("#loginEmail").val();
    var password = $("#loginPassword").val();

    $this = $(this);
    $.ajax({
        type: "POST",
        url: "login",
        data: $this.serialize()
    }).done(function(data) {

        console.log("GO!");

        if (data) {

            firebase.auth().signInWithEmailAndPassword(data.email, data.password ).then( authData => {
                $.ajax({
                    type: "POST",
                    url: "login2",
                    data: authData
                }).done(function(result) {
                    if (result == "SUCCESS0!") {
                        localStorage.setItem('amazingProMembership',true);
                        localStorage.setItem('success_msg_local2', 'You have logged in');
                        window.location.href="/screenshots/index";
                    }
                    else if (result == "SUCCESS1!") {
                        localStorage.setItem('success_msg_local2', 'You have logged in');
                        window.location.href="/screenshots/index";
                    }
                    else if (result == "ERROR!"){
                        firebase.auth().signOut().then(function() {
                            localStorage.setItem('error_msg_local', 'Please confirm your email address. Check your inbox.');
                            window.location.href="/users/login";
                            ("Login Failed: ", error);

                        });
                    }
                });

            },function(error) { 

                var errorCode = error.code;
                var errorMessage = error.message;
                localStorage.setItem('error_msg_local', "Unknown user or password");
                window.location.href="/users/login";
                ("Login Failed: ", errorMessage, errorCode);

            });  
        }
        else {
            localStorage.setItem('error_msg_local',  'Recaptcha failed'); window.location.href = "/users/login";
        }
    });
});

最佳答案

将数据添加到实时数据库时,如果您想确保数据在服务器端得到正确验证和清理,最简单、最安全的方法是 Cloud Functions for Firebase 。你可以写一个database trigger每当数据在感兴趣的位置发生更改时执行,以便在必要时对数据进行更改。函数还可以根据需要调用其他 API,包括 recaptcha。

关于javascript - 如何确保我的数据在 Firebase 登录之前和之后都经过清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44518527/

相关文章:

c# - 将 JSON 对象发布到 WCF 服务对象始终为 null

ajax - Django 1.9 AJAX 表单 CSRF token 403 错误 - "CSRF cookie not set"

firebase - firebase.json 中的函数有没有更好的写 "rewrites"的方法?

node.js - 确定是否向 Firebase 实时数据库添加或删除数据

javascript - Knockout attr href 输出问题

javascript - 如何保证主体中间的脚本在所有 DOM 完成加载后运行

php - 如何使用 PHP 向 JavaScript 提供信息?

javascript - 使用 javascript innerHTML 删除以前的文本并显示新文本

javascript - 当我单击更新按钮时,它不会更改/更新(CodeIgniter,更新多行)

Android AppCompat-v7 和 Firestore gradle 冲突