我正在使用 Meteor 及其帐户系统。我的注册过程涉及重置密码的几个步骤。
Template['enrollment'].events({
'submit #reset-password-form': function (e, template) {
e.preventDefault();
let token = Session.get('_resetPasswordToken');
let user = Meteor.users.findOne({ "services.password.reset.token": token });
let password = $(e.target).find('input#password').val();
if (AutoForm.validateForm('reset-password-form')) {
resetPasswordAsync(token, password)
.then(() => {
return Meteor.promise('Orders.initialize', template.data);
})
// a few more `.then()s`
.catch((error) => {
Notify.warn(error.message);
Meteor.call('User._resetToken', user, token);
})
}
}
});
这样做的原因是,如果 promise 链中出现任何失败,那么它们将保留在同一页面上,但具有“未初始化”状态。
我使用 meteor 方法,因为用户不应该能够通过更改他/她的服务来更改其 token 。
Meteor.methods({
'User._resetToken': function (user, token) {
check(user, Meteor.users.simpleSchema());
check(token, String);
Meteor.users.update(user._id, {
"services.password.reset.token": token
});
}
});
我隐约觉得这是不安全的,但又说不上为什么。是否存在可以利用在回调上重置用户 token 的任何漏洞?
最佳答案
首先不要向该方法提供用户对象,用户可能能够重置不同用户的重置 token 。
其次,仅仅因为您将其放入服务器方法中并不意味着它是安全的。控制台中的用户可以输入 Meteor.call(user,token)
并重置其 token 或任何其他用户的 token (假设他们知道其他用户的_id。
如果用户已经重置了密码,则根本不再需要 token 。它只需要短暂的生命。
关于javascript - 发送将 token 重置为之前状态的请求是否不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31706469/