Почему не может заснуть (3) перед проверкой входа, чтобы предотвратить грубую силу?

В сценарии входа в систему PHP, почему этот псевдокод не может предотвратить атаку методом подбора? Конечно, это все еще возможно, если уделить достаточно времени, но бесполезно грубо насиловать что-либо, кроме нескольких символов?

Изменить: я не спрашиваю, каков оптимальный способ создания сценария входа в систему — просто ли Sleep () является эффективным способом радикально сокращение шанс успеха атак грубой силы.

<?php
sleep(2)

if($_POST['password'] == $passwordInDB)
$loggedIn = true;
else {
sleep(3) //slow down even more on failed attempts.
echo "login failed";
}
....
?>

Предположения:

  1. Это обычный базовый веб-сайт, требующий предотвращения атак «лучше, чем ничего». Очевидно, что огромные сайты с миллионами пользователей — это совсем другая история.
  2. Apache настроен с MaxRequestWorkers на 100, например (по умолчанию: 256)
  3. Сервер достаточно мощный, чтобы обрабатывать 100 одновременных запросов.

Мой скрипт потратил 5 секунд, чтобы завершить неудачный запрос.

Разве злоумышленник не сможет выполнить в этом случае только 100 * 5/60 = 8,3 догадки в секунду? Что совершенно бесполезно для любого нормального пароля?

0

Решение

Многие комментарии, кажется, связывают «грубую силу» с атакой «распределенное отрицание». Они не то же самое. Для анализа «грубой силы» нам нужно рассмотреть только один злоумышленник, делающий поток запросов в попытке выяснить пароль.

Ваше использование sleep здесь хорошо Замедление процесса онлайн-авторизации — это хорошо изученная функция сопротивления. Вместо того, чтобы перефразировать сказанное, посмотрим, что сказал Том Лик о безопасности..

Я мог бы предложить что-то более умное, хотя. У вас действительно нет атаки, пока у вас не появятся доказательства повторных попыток. Таким образом, вам нужно считать попытки и замедляться как функция попыток: больше попыток, больше задержки. Это означает, что для вашего среднего пользователя, который получает, скажем, 3 попытки, они не испытывают искусственной задержки. Но более чем, скажем, 3, вы начинаете добавлять в max(32, 2^(n-3)) сон — этого должно быть достаточно, чтобы отразить любого, кто пытается атаковать грубой силой онлайн.

0

Другие решения

Других решений пока нет …