发送请求将令牌重置为以前的状态是否不安全?

Is it insecure to send a request to reset token to previous state?

本文关键字:状态 是否 不安全 请求 令牌      更新时间:2023-09-26

我正在使用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);
        })
    }
  }
});

这样做的原因是,如果承诺链中出现任何错误,那么它们将保持在同一页面上,但具有"未初始化"状态。

我使用流星方法,因为用户不应该能够更改他/她的服务来更改他们的令牌。

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
    });
  }
});

我隐约觉得这是不安全的,但不知道为什么。是否存在可以利用回调上重置用户令牌的漏洞?

首先不要向方法提供user对象,用户可能能够重置其他用户的重置令牌。

其次,仅仅因为你把它放在一个服务器方法中并不能保证它是安全的。控制台的用户可以输入Meteor.call(user,token)并重置他们的令牌或任何其他用户的令牌(假设他们知道其他用户的_id)。

如果用户已经重置了密码,则不再需要令牌。它只需要短暂的生命。