情况:
我正在尝试清理用户登录时输入的数据。
清理工作应在服务器端完成,但 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/