Проблема заключается в балансе между доступностью пользователя и моделью атакующего.
Первое решение
If not password correct for a certain number of time:
block the user
send a reset link to the user
Пользователь : может быть заблокирован, и им не нравится сброс
Атакующий : заблокировал всех пользователей, пытаясь пройти аутентификацию для всех пользователей (особенно если все логины доступны публично)
Второй раствор
If not password correct:
sleep(amount_of_time)
Вопрос в том, каково значение 'amount_of_time'?
Пользователь : может раздражать ожидание 'amount_of_time' для каждой ошибки
Атакующий : продолжайте попытки, с более низким тестом / сек
Третье решение
If not password correct:
sleep(amount_of_time)
amount_of_time = amount_of_time * 2
Пользователь : меньше раздражает за несколько ошибок пароля
Attacker : заблокировать подключение пользователя, отправив партию неверного пароля
Четвертое решение
If not password correct for a certain number of time:
submit a catchpa
Пользователь : необходимо разрешить CAPTCHA (не слишком сложно)
Атакующий : необходимо разрешить CAPTCHA (должен быть сложным)
Хорошее решение (и используется многими сайтами), но будьте осторожны с нашей CAPTCHA. осуществление . В любом случае есть хитрость (см. Следующее решение).
Пятое решение
If not password correct for a certain number of time:
block the ip
(eventually) send a reset link
Пользователь : Пользователь может быть заблокирован, потому что он не может правильно запомнить свой пароль.
Атакующий : пробует один и тот же пароль с другим пользователем, потому что блокировка зависит от количества логинов пользователя.
Окончательное решение?
If several login attempts failed whatever is the user by an IP :
print a CAPTCHA for this IP
Пользователь : Пользователю не может быть заблокирован IP-адрес, но он должен запомнить свой пароль.
Атакующий : сложно провести эффективную атаку грубой силой.
Важные заметки
Форма входа или ссылка для входа заблокирована? Блокировка формы входа бесполезна.
Сопротивление грубой силе - это ПЕРВАЯ проблема сложности пароля, поэтому вам нужна строгая политика паролей (особенно в случае распределенной грубой силы).
Я не упоминаю тот факт, что вы хэшировали свои пароли солью, вы уже делаете это правильно? Поскольку, если доступ к базе паролей проще, чем перебор, злоумышленник выберет это решение ( «Цепь настолько же сильна, как и ее самое слабое звено» ).