У меня такой же вопрос, как этот, на который был дан ответ 9 лет назад, и данные ответы совершенно бесполезны (Как отложить попытки входа в систему после слишком большого количества попыток (PHP))
Как вы можете отложить попытки входа в систему против ботов без использования sleep()? Кажется очевидным, что желание предотвратить DoS-атаки из клиентского кода сбивает с толку... Я не понимаю, где я могу установить «задержки» или «http-запрос на вход», чтобы он исходил от фактического сервера/apache или что-то.
Пожалуйста, будьте снисходительны, я оставил его на несколько дней из-за выгорания и вернулся к нему сейчас, все еще не найдя в нем понимания.
Я понимаю и реализую часть регулирования - я знаю, как настроить БД и таблицы для захвата каждой неудачной попытки, но не знаю, как настроить apache/сервер/все, что нужно настроить, чтобы «приостановить» сценарий (сценарий, который обрабатывает форму входа) для текущего пользователя/IP-адреса для входа в систему в течение следующих x секунд?
Это делается с помощью PHP? Или вы настроили свою конфигурацию apache или правило htaccess, чтобы сделать это? Мне очень нужна помощь в этом...
@RaymondNijland да, вот почему ответы на этот вопрос бесполезны, я прочитал десятки ответов на SO, говорящих о том, чтобы не использовать sleep(). Это действительно аппаратная проблема? Я не думал, что это нормальный способ сделать это. Если я не могу позволить себе оборудование, сделает ли мой сайт уязвимым для DoS-атак? (мой сервер веб-хостинга говорит, что защита от DoS-атак входит в пакет по умолчанию, но другие упоминали, что защита от DoS-атак вашего хоста находится только на уровне домена, поэтому она не слишком эффективна). Что я должен делать?
Также идея может заключаться в реализации входа в систему с ответом на вызов. Который каждый раз использует другую закодированную/хешированную строку входа и запутывает исходный код JavaScript. Скорее всего, это не полностью остановит настоящих хакеров/взломщиков, скорее всего, замедлит их, а scriptkiddies, скорее всего, перестанут пытаться
Другой идеей может быть внедрение клиентского SSL-сертификата для входа в систему. У браузера нет действительного клиентского SSL-сертификата, и соединение для входа






Вы не должны "sleep()" в самом скрипте, так как одна и та же система все еще может спамить несколько запросов, и все ваши потоки будут задерживаться в спящем режиме, а затем отвечать.
Одно из предложений состоит в том, чтобы сохранить IP-адрес и/или токен сеанса посещения, а затем, если этот IP-адрес/токен сеанса снова посещает слишком рано, вы просто отклоняете/отказываете запрос в PHP.
Таким образом, при каждом запросе проверяйте таблицу базы данных с попытками входа в систему, а затем, если этот идентификатор уже посещался в последнюю секунду (или как бы долго вы ни хотели, чтобы тайм-аут), просто отправьте ответ 429 Too Many Requests (или ваш соответствующий код неисправности). Если запрос свежий, сохраните его в базе данных и продолжите обработку.
Спасибо за предложение фактического решения, но похоже, что это все еще зависит от сценария и базы данных, которые, как я думал, боты могут обойти?
Если вы просто пытаетесь остановить людей, взламывающих ваш логин, все, что вам нужно, это изменения сценария в моем ответе. Также убедитесь, что ваш сайт защищен от атак SQLi и любых форм обхода аутентификации (хорошей идеей будет использование надежной библиотеки аутентификации, а не создание собственной). Если вы хотите остановить другие DoS-атаки, вам, вероятно, понадобится защита от DoS через вашего хостинг-провайдера или кого-то вроде Cloudflare.
Использование sleep() — плохая идея. sleep() сохраняет активность «процесса», поэтому он потребляет ЦП и ОЗУ. PHP — неподходящее место для решения этой проблемы. специальное оборудование для защиты от DoSS..