状况:
我正在尝试清理用户在登录时输入的数据。
应该在服务器端进行消毒,但必须在客户端上进行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";
}
});
});
答案 0 :(得分:1)
将数据添加到实时数据库时,如果要确保在服务器端正确验证和清理数据,则使用Cloud Functions for Firebase这是最简单,最安全的方法。只要在感兴趣的位置更改数据,您就可以编写database trigger来执行,以便在必要时对数据进行更改。函数还可以根据需要调用其他API,包括recaptcha。