我有非常通用的密码恢复代码,要求提供电子邮件,如果电子邮件存在则发送密码链接,如果没有则打印邮件。我想阻止人们尝试有效地收集帐户数据。我的理解是,由于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');
});
});
答案 0 :(得分:1)
我假设您试图阻止人们过于频繁地访问您的终端。仅靠睡眠是不可能实现的。攻击者可以简单地打开数百个并行请求。
您最好通过IP地址限制对端点的访问。保留IP地址的映射(js对象)以及每个地址访问端点的次数。如果IP地址多次访问端点,请禁用该IP地址的访问权限。每隔几个小时将对象和计数器重置为0.
如果你仍想实现睡眠,那么一般模式是setTimeout
调用。
function(done) {
var dosomething = function() {
//do something here
done();
};
setTimeout(dosomething, 1000);
};