Борьба со спамом в серверной стадии

Если у вас есть блог, вы наверняка не раз и не два получали спаммерские комментарии к своим записям. Для борьбы с этим новым злом придуманы разнообразные методы — блэклисты, статические или поддерживаемые динамически на отдельном сервере, антиспаммерские алгоритмы, основанные, например, на методе Бейеса, капчи и генераторы уникального кода, так или иначе осложняющие или делающие невозможным прямую передачу формы обработчику. Я их перепробовал много — спасибо разработчику плагина CCode&TCode, благодаря которому в этот блог практически не проходят комментарии от спаммеров. Для большинства блогов этих методов вполне достаточно, чтобы гарантированно защититься от спама. Но не для всех.
К сожалению, для этого блога, число записей в котором уже перевалило за 5 тысяч, более актуальной становится задача не защиты от спама как такового, а защиты от ботов, которые создают очень немаленькую нагрузку на сервер, пытаясь пропихнуть хоть что-то в этот блог. Приведу только один факт — в среднем в сутки в этом блоге к скрипту комментариев пытаются обратиться до 30 тысяч раз. Сопоставьте это с тем, что скрипт перловый — если бы этот блог хостился на обычном хостинге, что естественно для сайта с посещаемостью до пары тысяч человек в сутки, меня бы давно попросили с него из-за нагрузки на сервер. Переход на FastCGI, конечно, облегчил ситуацию, но ненамного.
В общем, естественным ходом оказалось перейти к блокированию спаммеров не плагинами к движку, а на более низком уровне. Алгоритм, пока реализуемый в основном вручную, дает прекрасные результаты и частично применим для любого блоггера. Полностью повторить его смогут, к сожалению, только те, у кого имеется полный доступ к администрированию сервера, на котором размещен блог.
Как это работает — я захожу в директорию, где хранятся лог-файлы Апача и даю в консоли команду:

grep ‘mt-comments.cgi’ access.log | awk ‘{print $1}’ | sort | uniq -c | sort -r > comm.txt,

где mt-comments.cgi — имя скрипта комментариев,
access.log — имя файла логов.
Если имена файлов у вас другие, замените их соответственно.
Результатом работы этой цепочки команд станет файл comm.txt, в котором будет находиться таблица, во втором столбце которой будет указан IP, а в первом — число обращений к скрипту комментариев вашего блога с данного IP. Список отсортирован по количеству запросов, поэтому вверху окажутся самые активные адреса. Дальше осталось познакомиться с обнаруженными товарищами командой whois IP-адрес. Тут позволю дать себе небольшой совет — если whois-запрос по данному адресу показывает какой-нибудь американский хостинг (например, ThePlanet или Velton.com), выпишите весь его адресный диапазон и на сайте зайдите. Если провайдер предлагает очень дешевые выделенные серверы — за $59-99 в месяц, да еще и без платы за установку, — целесообразнее блокировать сразу весь диапазон, поскольку нормальных посетителей оттуда вы не дождетесь, а вот спаммеров — запросто.
И, определившись со списком IP, вы идете их банить. Если это позволяет сделать хостинг-панель, это замечательно. Мы на сервере используем ipfw, поэтому просто даем из консоли команду ipfw add 55000 deny all from IPADDRESS to any — после чего любое обращение к серверу с указанного IP просто игнорируется без какой-либо реакции, причем это делает не скрипт, не даже вебсервер — это делает ядро системы, тратя самый минимум ресурсов.
Если у вас нет доступа к управлению файрволлом, вы можете заблокировать эти IP на уровне Апача — просто добавьте в файл .htaccess серию директив:

deny from IPADDRESS

Ну, а если у вас нет возможности составить свой список IP, вы можете воспользоваться моим — он составлен по результатам аналогичных операций с логами этого блога и последний раз пополнялся сегодня утром. Там, конечно, далеко не все адреса — я блокирую только самых активных, поскольку блог большой, ботов много и всех не забанишь. Тем более, что остается большой риск ложного срабатывания. В списке собраны те адреса, с которых пытались достучаться до комментариев не менее ста раз в сутки — согласитесь, вряд ли это нормальные пользователи. Кое-где приведены адреса вида /24 — это забанена вся подсетка, поскольку обращения шли не менее, чем с 5 адресов этого диапазона.
Пользуйтесь.