Ответ 1
Что-то вроде:
time_nanosleep(0, (10000000000 * (log($failed_attempts)^10)) );
Это даст вам экспоненциально увеличивающееся окно попыток.
Я установил свой 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();
}
}
Это не должна быть ваша стратегия против brutforcing, но это отличный компонент для этой стратегии, и IMO должна в значительной степени использоваться всегда.
Возможно, вы захотите увеличить это время экспоненциально, а не просто линейно; или сделать его фиксированным, например. отрицать в течение часа после 5 неудачных попыток.
Я знаю, что видел это где-то, хотя я забыл, где. В примере, который я видел, они удвоили задержку с каждой неудачной попыткой. Если вы начали с, скажем, 0,1 секунды, обычный пользователь, который может ошибочно вводить свой пароль один или два раза, получает задержку в 0,4 секунды. Они даже не заметят. Но кто-то, кто пытается наложить грубую силу, нападает на его быстроходную задержку в минутах или часах.
Я думаю, что для веб-приложения может возникнуть проблема запуска атаки на отказ в обслуживании. Все зависит от того, как система обрабатывает временные задержки.
Боты на самом деле не заботятся о вашей задержке, будь то экспоненциальная или логарифмическая или что-то еще. Любая задержка, которую вы используете, может быть преодолена путем опроса. Поэтому не думайте о задержке. Подумайте о том, как ограничить количество попыток и использовать Google reCAPTCHA. Он использует шифрование с открытым ключом. Работает для устранения большинства ботов и труднее взломать.