суббота, 19 июля 2008 г.

Я против CAPTCHA

Озолотись прямо сегодня, пока не поздно. Контент. Лучшее соотношение цены и качества. *
[Горбачёв]
На днях хотел написать про то, как бороться со спамом в комментах, а тут смотрю у Димка как раз на эту тему. Есть над чем поржать:)

Однажды всех владельцев блогов/сайтов настолько достал спам в комментарии, что умные программисты придумали отличать спам-ботов от людей с помощью штуки, которую они заумно назвали CAPTCHA, а мы называем "капча".

И всё, казалось, стало зашибись.

А я считаю, что капча - зло, расскажу почему и как без неё обойтись.

Почему зло?
Капча мешает боту спамить в ваш блог. шутка:)

Капча заставляет любого человека доказывать что он "не верблюд", а это почти никому не нравится. Особенно, в тяжёлых случаях, когда это удаётся не с первого раза:)
А ещё некоторые боты распознают её лучше человека. Может ещё раз подумаем, против кого боремся?

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

Врезка про злых спам-ботов.
Спам-бот - нечто, рассылающее сообщения в формы комментариев (форумы, обратной связи, гостевые книги и любые другие формы). Для работы ему необходимы начальные данные:
1. Сообщение для рассылки.
3. Набор правил, описывающий правила отправки на каждый сайт(или тип сайта).
2. Список сайтов, на которые он будет рассылать.

Сообщение готовит злоумышленник (или рекламный отдел заказчика рассылки:)).

Набор правил создаёт программист, или дополнительный анализатор, написанный (или обученый) опять программистом. В этом наборе описаны названия полей, их смысл, разрешённые способы кодирования ссылок и т.п.

Со списком сайтов возможны варианты - либо он создаётся вручную, либо специальным сборщиком. Просто, чтобы вы знали:)

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

Это важно. Становится понятно, почему современные спам-боты не загружают страницу с формой, а сразу шлют ответ - таким образом они экономят многа-многа денежкав.
Конец врезки.


Врезка про злых "спамеров вручную".
Могу только сказать, что никакими способами с этим типом типов бороться не получится.
Конец врезки.

Всё, лирика закончилась. Дальше просто способы которые я придумал.

1. Отличайся от серийного.
Многие используют стандартные движки. Такие движки легко узнаются по только им присущим признакам например, по строке "Powered by... " где-нибудь в коде страницы, или структуре URL'а. Некоторые автосборщики баз заносят такие сайты в базы даже не проверяя наличие нужной им формы. Просто используют стандартный для этого движка URL.

Измени action-URL в форме постинга и переименуй скрипт (или что там у тебя).
Это не помешает сборщику найти сайт, но постинг будет, скорее всего, неудачным.

2. Используй сессии даже для гостей.
Создавай сессию даже для неавторизованных пользователей. Не принимай пост без сессии. Это поможет отсеять ещё какой-то процент ботов, неумеющих работать с cookie.

3. Используй ненужное поле.
Добавь в форму поле с name="email", а настоящее поле для почты переименуй во что-нибудь.
Пропиши для нового поля display: none; (во внешнем CSS).
Теперь, если в этом поле есть значение - значит спам-бот.

Дальше с JavaScript
4. Подставляй action-URL в форму c помощью скрипта по onsubmit. В самом скрипте держи "зашифрованным" (хотябы как 'htt'+'p:/'+'/si'+'te.'+'ru/'+'comm'+'ent.p'+'hp'). Это помешает автосборщику найти URL принимающего скрипта.

5. Кодируй между собой имя поля и значение.
Простой способ: в имя поля добавляем (клиентским скриптом) четыре случайных символа, а в значение те же символы в обратном порядке. На сервере проверяем - не совпадают "подставки" в имени и значении, значит спам-бот.

6. Кодируй всю форму случайно.
Функции-кодировщику на каждую загрузку страницы передавай случайные параметры. При сабмите функция будет кодировать все поля/значения и добавлять поле с параметрами кодирования.
Вариант - сделай несколько функций-кодировщиков с разными алгоритмами и выдавай случайно.

7. Выставляй cookie на клиенте.
Ставь случайную куку клиентским скриптом и добавляй её значение в форму при сабмите. На сервере проверяй совпадение куки и формы.

Пока всё.

Насколько это надёжно?

В принципе, создать спам-бота с встроенным SpiderMonkey или Rhino возможно. Но ещё придётся эмулировать DOM-структуру. И наверняка ещё куча трудностей.

Другой способ - использовать обыкновенный браузер с управляющей надстройкой. Вряд-ли будут использовать профессионалы - увеличится расход трафика.
Всё на халяву, только для бомжей

* Эффективная реклама в бомжеленте.

Помогите Марине!

[http://blog.rumoneybook.net/2008/07/captcha.html]