У меня есть система, которая использует чистый хвостовая рекурсия в нескольких местах для моделирования конечного автомата.
Я бы посоветовал, если пользователь безуспешно пытался, скажем, более пяти раз и пяти минут, вы немедленно начали возвращать 503 Service Unavailable
для этого IP-адреса. В случае сбоя входа в систему вы можете использовать memcache для получения текущих неудачных попыток для IP, а затем увеличить количество и сохранить его обратно в memcache с истечением 5 минут.
Вы не хотите помещать сна
в свой PHP-код, так как это позволит одному пользователю создавать множество подключений к вашему веб-серверу и потенциально сбивать других пользователей.
Поскольку пользователь не вошел в систему, у вас нет файла cookie сеанса, и если пользователь пытается подобрать себе путь к учетной записи, он может вообще не предоставить файл cookie.
Я не уверен, что лучше всего использовать, но при борьбе с DoS-атаками лучше всего направить трафик прочь от вашего сервера. Установка тайм-аутов на самом деле не поможет, потому что вы все еще обрабатываете запрос и используете PHP.
Рассматривали ли вы установку другого веб-сервера, на котором будет запущена более простая урезанная версия вашей страницы входа? Когда пользователь пытается слишком много раз (например, тысячи раз), отправьте сообщение, чтобы настроить маршрутизатор и перенаправить этого пользователя на второй веб-сервер.
Это похоже на то, когда веб-сайты получают эффект слэш-точки, многие из них просто перенаправляйте трафик, пока трафик не уменьшится.
Я использовал что-то вроде этого ...
Проверить имя пользователя и пароль
1.1 Если нет совпадений, запишите время последнего неудачного входа в систему для этой комбинации и количество неудачных входов в систему.
1.2 Каждый сбой увеличивает время ожидания между возможностью входа в систему, например, failsCount *, от 30 секунд до максимального (например, 10 минут).
Я разработал это, но еще не выпустил в открытый доступ, поэтому любые отзывы будут оценены.