2015-04-28 4 views
0

У меня есть довольно общий код восстановления пароля, который запрашивает электронное письмо, и отправляет ссылку на пароль, если существует электронное письмо или печатает сообщение, если это не так. Я хочу, чтобы люди не пытались эффективно собирать данные учетной записи. Я понимаю, что поскольку Node является однопоточным, сон блокирует все другие действия. Что является хорошим способом продлить действие получения пользовательских данных (как полная секунда).Node Sleep Command при восстановлении пароля - предотвращение сбора урожая

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

Я предполагаю, что вы слишком часто пытаетесь заставить людей получать доступ к вашей конечной точке. Сон сам по себе не достигнет этого. Злоумышленник может просто открыть сотни параллельных запросов.

Вам гораздо лучше ограничить доступ к конечной точке через IP-адрес. Храните карту (объект js) IP-адресов и количество раз, когда каждый адрес обратился к конечной точке. Если IP-адрес достиг конечной точки более чем несколько раз, отключите доступ для этого IP-адреса. Сбрасывайте объект и счетчики до 0 раз в несколько часов.

Если вы все еще хотите реализовать спящий режим, тогда общий шаблон с вызовом setTimeout.

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

Если они открывают сотни соединений, они могут получать только несколько сотен в секунду. Хотя это, вероятно, самый эффективный способ сделать это, экономическая выгода сна в моем конкретном случае перевешивает отслеживание IP-адресов. – jn1kk

Смежные вопросы