У нас есть приложение Play, в настоящее время используется версия 2.6. Мы пытаемся предотвратить словарную атаку на наш логин, задерживая сообщение «Неудачный логин» нашим пользователям, когда они вводят неверный пароль. В настоящее время у нас есть sh и соль, и у нас есть все лучшие практики, но мы не уверены, правильно ли мы задерживаемся. Таким образом, у нас есть в нашем контроллере:
public Result login() { return ok(loginHtml) }
и у нас есть:
public Result loginAction()
{
// Check for user in database
User user = User.find.query()...
// Was the user found?
if (user == null) {
// Wrong password! Delay and redirect
Thread.sleep(10000); <<-- how do delay correctly?
return redirect(routes.Controller.login())
}
// User is not null, so all good!
...
}
Мы не уверены, является ли Thread.sleep(10000)
лучшим способом отложить ответ, так как это может привести к зависанию другие запросы, которые приходят или используют слишком много потоков из пула по умолчанию. Мы заметили, что при скорости 80+ обращений в секунду Play Framework не перенаправляет наши HTTP-вызовы в Routes. То есть, если мы получим запрос HTTP POST, наше приложение не будет даже отправлять этот запрос на контроллер через 20 с лишним секунд, ОДНАКО в тот же период времени, если мы получим запрос HTTP GET, наше приложение обработает этот GET мгновенно. !
В настоящее время у нас есть 300 потоков в качестве минимальных / максимальных значений в наших настройках Akka для пула вилок по умолчанию. Любые идеи будут оценены. Мы запускаем t2.xlarge AWS EC2 экземпляр с Ubuntu.
Спасибо.