Я установил свой db для регистрации каждой неудачной попытки входа в систему. Я думал, что умножу количество неудачных попыток с 0,05 секунды или что-то в этом роде. Что-то вроде:
time_nanosleep(0, (50000000 * $failed_attempts ) );
Больше попыток, которые хакер использует для угадывания пароля, требуется больше времени, чтобы проверять каждый раз. После проверки 100 паспортов он должен ждать 5 секунд между каждой попыткой.
Это хороший способ остановить перебор? Я идентифицирую пользователей по IP. Поэтому я предполагаю, что вы можете использовать приложение с несколькими прокси-серверами или что-то в этом роде, но, кроме того, я думаю, что это хорошая идея. Ребята, что вы думаете?
Что-то вроде:
time_nanosleep(0, (10000000000 * (log($failed_attempts)^10)) );
Это даст вам экспоненциально увеличивающееся окно попыток.
Первая проблема, которую я вижу, это то, что вы имеете дело с ботом, который не заботится о том, есть ли задержка между ответами. Если вы не сделаете что-то, чтобы ограничить это, вы используете системные ресурсы с потенциально очень длинными задержками. Просто запретите IP после 5 неудачных попыток. Это может быть временный запрет, если вы беспокоитесь о запрете реального пользователя.
Ограничить повторы IP и использовать CAPTCHA. Не перегружайте свой сервер, подумайте KISS.
Вы должны стараться не использовать Sleep (), потому что он использует циклы процессора, и если у вас есть атака грубой силы с 10 000 IP-адресов, вы будете развивать 10 000 спящих () дочерних процессов или потоков, это вызовет нагрузку на ваш сервер.
Вместо этого попытайтесь заблокировать IP-адрес с помощью PHP. Что-то вроде этого.
function block_ip($ip) { $deny = array("$ip"); if (in_array ($_SERVER['REMOTE_ADDR'], $deny)) { header("HTTP/1.1 403 Forbidden"); exit(); } }
Это не должна быть ваша стратегия против грубой силы, но это отличный компонент для этой стратегии, и IMO должна в значительной степени использоваться всегда.
Возможно, вы захотите увеличить это время экспоненциально, а не просто линейно; или сделать его исправленным, например, отрицать в течение часа после 5 неудачных попыток.
Я знаю, что видел это где-то, хотя я забыл, где. В примере, который я видел, они удвоили задержку с каждой неудачной попыткой. Если вы начали с, скажем, 0,1 секунды, обычный пользователь, который может ошибочно вводить свой пароль один или два раза, получает задержку в 0,4 секунды. Они даже не заметят. Но кто-то, кто пытается наложить грубую силу, нападает на него быстро, чтобы получить задержки в минутах или часах.
Я думаю, для веб-приложения может возникнуть проблема запуска атаки на отказ в обслуживании. Все зависит от того, как система обрабатывает временные задержки.
Боты действительно не заботятся о вашей задержке, будь то экспоненциальная или логарифмическая или что-то еще. Любая задержка, которую вы используете, может быть преодолена путем опроса. Поэтому не думайте о задержке. Подумайте о том, как ограничить количество попыток и использовать Google reCAPTCHA. Он использует шифрование с открытым ключом. Работает для устранения большинства ботов и сложнее взломать.