увеличение задержки входа в систему, чтобы остановить брутфорсинг, хорошая идея?
Я настроил свою базу данных для регистрации каждой неудачной попытки входа в систему. Я думал, что умножу количество неудачных попыток на 0,05 секунды или что-то в этом роде. Что-то вроде:
time_nanosleep(0, (50000000 * $failed_attempts ) );
Чем больше попыток хакер использует для угадывания пароля, тем больше времени требуется для проверки каждый раз. После проверки 100 пропусков он должен ждать 5 секунд между каждой попыткой.
Это хороший способ прекратить брутфорсинг? Я идентифицирую пользователей по IP. Поэтому, я думаю, вы можете принудительно использовать приложение, используя несколько прокси-серверы или что-то в этом роде, но, кроме того, я думаю, что это хорошая идея. Что вы, ребята, думаете?
8 answers
Как насчет чего-то вроде:
time_nanosleep(0, (10000000000 * (log($failed_attempts)^10)) );
Это даст вам экспоненциально увеличивающееся окно попыток.
Первая проблема, которую я вижу, заключается в том, что вы имеете дело с ботом, которому все равно, есть ли задержка между ответами. Если вы не сделаете что-то, чтобы ограничить это, вы используете системные ресурсы с потенциально очень длительными задержками. Просто забаньте IP-адрес после 5 неудачных попыток. Это может быть временный запрет, если вы беспокоитесь о запрете реального пользователя.
Ограничьте повторные попытки по IP и используйте КАПЧУ. Не перегружайте свой сервер, подумайте о ПОЦЕЛУЕ.
Вы должны стараться не использовать Sleep(), потому что он использует циклы процессора, и если у вас есть атака грубой силы с 10 000 ip-адресов, вы разветвляете 10 000 дочерних процессов или потоков sleep(), это вызовет нагрузку на ваш сервер.
Вместо этого попробуйте заблокировать 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. Он использует шифрование с открытым и закрытым ключами. Работает для устранения большинства ботов, и его сложнее взломать.