密码恢复节点睡眠命令 - 防止帐户收获

时间:2015-04-28 23:21:11

标签: node.js security password-recovery

我有非常通用的密码恢复代码,要求提供电子邮件,如果电子邮件存在则发送密码链接,如果没有则打印邮件。我想阻止人们尝试有效地收集帐户数据。我的理解是,由于Node是单线程的,睡眠会阻止所有其他操作。什么是延长获取用户详细信息的行为的好方法(比如一整秒)。

app.post('/login/recover', function(req, res, next) {
    async.waterfall([
        function(done) {
            // generate hash here
        },
        function(token, done) {
            var genReset = function(user) {
                if (!user) {
                    // SLEEP HERE!?!?!?
                    req.flash('failureMessage', 'No account with that email address exists.');
                    return res.redirect('/login/recover');
                }
                user.resetPasswordToken = token;
                user.resetPasswordExpires = moment().add(1, 'hours').format(); // 1 hour
                //save user here
            }
            user_manager.getUserForEmail(req.body.email, genReset);
        },
        function(token, user, done) {
            // email here
            req.flash('successMessage', 'Password link sent!');
            done(null, 'done');
        }
    ], function(err) {
        if (err) {
            return next(err);
        }
        res.redirect('/login/recover');
    });

});

1 个答案:

答案 0 :(得分:1)

我假设您试图阻止人们过于频繁地访问您的终端。仅靠睡眠是不可能实现的。攻击者可以简单地打开数百个并行请求。

您最好通过IP地址限制对端点的访问。保留IP地址的映射(js对象)以及每个地址访问端点的次数。如果IP地址多次访问端点,请禁用该IP地址的访问权限。每隔几个小时将对象和计数器重置为0.

如果你仍想实现睡眠,那么一般模式是setTimeout调用。

function(done) {
  var dosomething = function() {
    //do something here
    done();
  };
  setTimeout(dosomething, 1000);
};