Всё началось несколько месяцев назад, когда в комментарях к постам моего блога начал появляться спам. Сначала я даже не понял, что это спам, так как сообщения носили в большинстве своём довольно невинный характер, например "What a wonderful post!" или "I agree 100%". Единственное, что их отличало от "нормальных" комментариев - это завидная регулярность (несколько комментариев в неделю, что для моего блога выше среднего) и ссылка на какой-нибудь коммерческий сайт в поле "Website". Кроме того, спам был исключительно на английском языке, что опять же нехарактерно для моего на 90% русскоязычного блога. Когда текст спамерских комментариев стал повторяться, я заподозрил неладное и предпринял
Шаг 1. Модерация комментариев. Сама по себе модерация комментариев не избавляет от спама, скорее наоборот, заставляет уделять время модерированию даже человеческих комментариев, однако модерация позволила избавить от спама хотябы читателей моего блога, которые получали спам в виде ответов на их собственные комментарии.
Модерация не утруждала меня до тех пор, пока количество спама не выросло от нескольких сообщений в неделю до нескольких сообщений в день. Тогда я уделил время выяснению вопроса о том, как же предлагают бороться с этой проблемой создатели BlogEngine.NET, который я использую в качестве движка для своего блога. Оказалось, в нём реализован механизм под названием CAPTCHA, который заключается в наличии скрытого поля, в которое роботы-спамеры будут заносить некое значение, а человек - нет, что и помогает отличить робота от человека. Вполне логично для меня, роботы просто не заносят ничего в скрытые поля, тем самым нейтрализуя эту защиту. Чтобы как-то затруднить роботам жизнь, я предпринял
Шаг 2. Вместо скрытого поля CAPTCHA, я сделал его открытым, но поместил в скрытый DIV. Это не избавило от спама полностью, видимо некоторые роботы оказались достаточно умными, чтобы пройтись вверх по иерархии DOM-элементов и проверить их состояние. Однако количество таких "умников" снова упало до вполне приемлемого для модерации числа, так что я получил перерыв ещё в несколько месяцев.
Однако по прошествии некоторого времени количество спамерских сообщений снова стало быстро расти, что заставило меня вернуться к изучению этого вопроса. Оказалось, появилось уже довольно много жалоб на нееффективность метода CAPTCHA, так что авторы движка BlogEngine.NET разработали новое решение в виде
Шаг 3. Автоматическое модерирование комметариев. Автоматическое модерирование включает в себя несколько довольно очевидных правил, а для борьбы со спамом прелагается парочка фильтров (StopForumSpam, AkismetFilter), суть работы которых заключается в проверке комментария на "добропорядочность" через некие онлайн-сервисы, которые по задумке авторов собирают все спамерские сообщения в свои базы и таким образом умеют отличать их от человеческих. Соответственно, если комментарий ошибочно причислен к разряду человеческих, имеется возможность уведомлять об этом сервис, тем самым улучшая его. После нескольких дней использования доступных для BlogEngine.NET фильтров, стало очевидным, что их эффективность не многим превышает 50%. Т.е. около половины спама благополучно оседало на страницах моего блога, что естественно меня не устраивало и заставило вернуться назад к ручному модерированию.
Исчерпав таким образом стандартные возможности по защите от спама, предоставляемые движком, я начал задумываться о собственном решении. Первое и самое незатратное по времени решение, которое пришло мне в голову - это
Шаг 4. Добавить обязательное поле и валидатор к нему, не пропускающий ничего, кроме определённого сообщения. В качестве "секретного" сообщения я выбрал "I'm human", а чтобы читатели знали, что вводить в это поле, рядом с полем значилось "Защита от спама, введите "I'm human"". Реализация этого решения заняла всего несколько минут моего времени и сократила поток спама в несколько раз, тем самым снова вернув его количество в рамки приемлемого для ручной модерации.
Однако снова ненадолго. У меня есть несколько версий того, как роботы-спамеры обходили мою защиту, но суть остается той же - объём спама довольно быстро вернулся на прежний уровень, а потом и превзошёл его. На пике спамерской активности я получал до 1000 спамерских сообщений в день, что вышло за рамки всего разумного и вынудило меня просто не читая удалять все комментарии на английском языке. Анализ IP оставивших спамерские комментарии пользователей показал, что большинство спамерских атак происходило из Китая.
Таким образом, мне не осталось ничего, как выделить время на полноценное решение, коим стал
Шаг 5. Картинка с текстом. На форму для комментария я поместил генерируемую в коде картинку с несколько искажённым текстом и поле для ввода этого текста пользователем. При отправке комментария мой код на сервере сверяет эти два текста и либо принимает комментарий, либо отвергает как спамерский. Реализация этого решения несколько затруднилась тем, что отправка комментариев в BlogEngine.NET осуществляется через ASP.NET AJAX, причём конкретный способ использования этого инструмента (на мой взгляд) оставляет желать лучшего. Кроме того, мне не хотелось вносить слишком много изменений в незнакомый мне код, так что для некоторых моментов я предпочёл простоту 100%-ной элегантности. Тем не менее, после нескольких часов реализации и отладки всё заработало как надо.
С момента внесения этих изменений я не получил ни одного спамерского сообщения, что вселяет в меня оптимизм по поводу его долгосрочности (или же вызывает опасения о работоспособности формы для комментария
). Если кого-то заинтересовала реализация данного решения для BlogEngine.NET - пишите (в комментарии
), и я выложу детали внесённых мною правок.