Отслеживание и тестирование недобросовестных клиентов в PHP


Теперь есть тема, которую можно было бы обсудить многими способами. Надеюсь, я смогу прояснить это, когда опишу свою проблему и начну получать предложения.

Я разрабатываю сайт, который заменит существующий. Исторически сложилось так, что одна из проблем, с которой мы сталкивались, - это появление ботов-пауков и высасывание всего контента. Теперь мы не возражаем против загрузки контента. На самом деле мы рады этому, однако некоторые из массовых загрузчиков и ускорителей загрузки оказались проблематичными с текущим сайтом.

То, что я ищу, - это что-то, что можно разместить в начале моего php, который запускается в значительной степени первым. Он берет отпечаток пальца запроса страницы (ip-адрес, ссылка, uri запроса, файлы cookie, идентификатор сеанса, что угодно) и передает его... чему-то. Это нечто затем сравнивает отпечаток пальца с отпечатками пальцев в последнюю секунду или три. Затем он возвращает сообщение на основе некоторого предварительно настроенного порога, что делать с запросом.

Некоторые пороговые значения:

  • Пользователь запросил >x страниц за последние 0.n секунд.
  • Пользователь запросил ту же страницу за <0.n секунд.
  • Пользователь отправил идентичные данные в форму за последние n секунд.

Итак, вы видите, что я смотрю на некоторые довольно узкие окна. Возможно ли вообще обнаружить такие вещи? Смогу ли я сделать это с помощью какого-либо файла или источника данных БД? Все, что я использую для хранения отпечатков пальцев между загрузками страниц, будет чтобы испытать большой отток, так как большая часть данных будет храниться в течение секунды или двух. Должен ли я просто иметь что-то, что анализирует журналы apache для проверки порога? Должен ли я искать какой-то внешний демон, который хранит данные в течение секунды или двух в памяти, которые я могу вызвать из сценария? Есть ли что-то в apache, что может справиться с этим, и мне просто нужно обратиться к парню-серверу, чтобы справиться с этим?

Предполагая, что это то, что я могу сделать на PHP или как-то еще внешний демон как мне реагировать на поведение за пределами пороговых значений? Моя интуиция подсказывает HTTP-ответы, что-то вроде 408 или 503, но моя интуиция часто ошибается. Что я могу сделать, чтобы сказать клиенту немного отступить? Какая-то страница "Ух ты"?

Author: Tyson of the Northwest, 2009-10-30

3 answers

Попробуйте PEAR::http_floodcontrol и mod_security и fail2ban.

 2
Author: powtac, 2009-10-30 21:16:37

Если у вас нет программного решения, почему бы не запрограммировать ваш маршрутизатор/брандмауэр, чтобы справиться с этим за вас? Фильтрация DOS-атак (или их эквивалентов) является частью того, для чего она существует.

 3
Author: Russell Steen, 2009-10-30 21:03:10

Попробуйте mod_evasive

 2
Author: Azeem.Butt, 2009-10-30 21:08:50