Vitalii Tsybulnyk / Виталий Цыбульник

On Software Development / О софтверной разработке

About the author

    Vitalii Tsybulnyk
Vitalii Tsybulnyk is a Software Engineering Manager at Mictosoft Azure.
E-mail me Send mail

Activity

Recent comments

Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2008-2017

Как я победил спам в комментариях к своему блогу

Всё началось несколько месяцев назад, когда в комментарях к постам моего блога начал появляться спам. Сначала я даже не понял, что это спам, так как сообщения носили в большинстве своём довольно невинный характер, например "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%-ной элегантности. Тем не менее, после нескольких часов реализации и отладки всё заработало как надо.

С момента внесения этих изменений я не получил ни одного спамерского сообщения, что вселяет в меня оптимизм по поводу его долгосрочности (или же вызывает опасения о работоспособности формы для комментария Smile). Если кого-то заинтересовала реализация данного решения для BlogEngine.NET - пишите (в комментарии Wink), и я выложу детали внесённых мною правок.


Categories: Development
Posted by Vitalii Tsybulnyk on Tuesday, December 7, 2010 6:59 AM
Permalink | Comments (4) | Post RSSRSS comment feed

Comments (4) -

Nikolay Ukraine

Thursday, December 9, 2010 12:06 PM

На всех "своих" сайтах на WordPress очень долгое время использую WP-SpamFree — это плагин для WordPress.
Home Page: www.polepositionmarketing.com/library/wp-spamfree/

Спам отсутствует как класс. Учитывая огромную популярность WordPress, это может говорить о его эффективности.
Если твои роботы научатся распознавать циферки - посмотри на исходники плагина (PHP), может и к BlogEngine.NET прикрутишь.

Vitalii Tsybulnyk United States

Thursday, December 9, 2010 12:31 PM

2 Nikolay: Боюсь, что если боты научатся распознавать текст на картинках, то это станет концом эры интернета такого, каким мы его знаем, т.к. миллионы онлайн-бизнесов строят на этом свою защиту. Код WP-SpamFree на досуге посмотрю, спасибо за совет.

Nikolay Ukraine

Thursday, December 9, 2010 12:42 PM

В таком случае, поздравляю с концом интернета Smile
Такой текст, как у тебя, распознать, оказывается, не сложно.

Proof:
http://habrahabr.ru/blogs/javascript/50265/
habrahabr.ru/blogs/artificial_intelligence/67194/

Если ты картинку генерируешь сам, без использования какой-то сторонней известной библиотеки, то это возможно, будет спасением — конкретно под тебя никто обучать робота не будет, а доступен ли уже универсальный алгоритм для распознавания таких текстов, посмотрим со временем на примере твоего блога.

Vitalii Tsybulnyk United States

Thursday, December 9, 2010 1:37 PM

2 Nikolay: Ну да, я выразился не совсем точно.
Конечно же, алгоритмы распознавания текста существуют давно (например тот же Fine Reader), хотя работа их основана на теории нейронных сетей и искусственном интелекте, т.е. не попадает в моём понимании в разряд "несложных".
Однако особенности этих алгоритмов в том, что (а) их работа ухудшается экспоненциально при ухудшении качества картинки, (б) алгоритм требует долгого обучения, причём чем "изысканней" искажения текста, тем больше обучения или даже доработок алгоритма требуется.
Эти особенности и делают представление текста в виде графики с последующим искажением довольно эффективной защитой от автоматического распознавания, ведь (как ты правильно заметил) под каждый вид искажения алгоритм надо тренировать или даже дорабатывать.
"Концом эры интернета" я назвал как раз умение ботов распознавать ЛЮБЫЕ произвольные искажения текста, что пока к счастью не сделано, насколько мне известно.
Ссылки занятные, спасибо, обогатился.

Я генерирую текст сам, алгоритм искажения тоже мой, так что надеюсь никто не будет адаптировать свои пушки под него. Поэтому и искажение я сделал таким слабым, раздражает на многих сайтах когда и человек не в состоянии разобрать текст Smile

Add comment




  Country flag

b i u quote
Loading