javascript - 发送将 token 重置为之前状态的请求是否不安全?

标签 javascript node.js security web meteor

我正在使用 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/

相关文章:

javascript - 如何在同时使用 Javascript 和 ERB 模板时保持 DRY (Rails)

javascript - 为什么我在 div 中的移动按钮没有反应?

javascript - 整个项目的 Git 一个仓库(前端 + node.js)

javascript - 有条件激活的 rxjs 可观察速率限制器

javascript - 这是跨站脚本: DOM in dhtmlHistory. js吗

c# - 在带有 MVC 3 的 ELMAH 中,如何从错误日志中隐藏敏感表单数据?

java - 可以用 sun.misc.unsafe 破坏安全管理器吗?

javascript - 如何在不复制粘贴相同代码的情况下简化单击相同的类?

javascript - d3.js NVD3 手动触发工具提示

javascript - 从 javascript 中的字符串中提取数据的更有效方法?