Практические подходы CAPTCHA без изображений?

Похоже, мы добавим поддержку CAPTCHA в Stack Overflow. Это необходимо для предотвращения действий ботов, спамеров и других вредоносных скриптов. Мы только хотим, чтобы люди публиковали или редактировали здесь!

Мы будем использовать JavaScript (jQuery) CAPTCHA в качестве первой линии защиты:

http://docs.jquery.com/Tutorials:Safer_Contact_Forms_Without_CAPTCHAs

Преимущество этого подхода в том, что для большинства людей CAPTCHA никогда не будет видна!

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

Я написал традиционный элемент управления CAPTCHA для ASP.NET, который мы можем использовать повторно.

CaptchaImage

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

Я видел такие вещи, как..

  • ASCII текстовая капча: \/\/(_)\/\/
  • математические головоломки: что такое 7 минус 3 раза 2?
  • пустяковые вопросы: что вкуснее, жаба или эскимо?

Может быть, я просто склоняюсь к ветряным мельницам здесь, но я хотел бы иметь менее ресурсоемкий, не основанный на изображениях <noscript> совместимая капча, если это возможно.

Идеи?

103 ответа

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

Чтобы перефразировать резюме из статьи jQuery:

  1. При создании контактной формы на сервере...
  2. Хватай текущее время.
  3. Объедините эту временную метку плюс секретное слово, сгенерируйте 32-х символьный хэш и сохраните его в виде файла cookie в браузере посетителя.
  4. Храните хэш или метку времени в скрытом теге формы.
  5. Когда форма отправляется обратно, значение временной метки будет сравниваться с 32-символьным "токеном", хранящимся в cookie.
  6. Если информация не совпадает или отсутствует, или если отметка времени слишком старая, остановите выполнение запроса...

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

Кто-то также предлагает JavaScript-библиотеку Raphael, которая позволяет вам рисовать на клиенте во всех популярных браузерах:

http://dmitry.baranovskiy.com/raphael/

..но это не сработает <noscript> дело, теперь бы это?:)

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

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

По общему признанию, у Stackru очень хорошо осведомленная аудитория, поэтому можно использовать гораздо больше креативных решений. Но для более заурядных сайтов вы действительно можете использовать только то, к чему привыкли люди, иначе вы просто вызовете путаницу и потеряете посетителей сайта и трафик. В общем, CAPTCHA не должны быть настроены на остановку всех ботов или других векторов атаки. Это просто усложняет задачу для законных пользователей. Начните с простого и усложняйте, пока у вас не будет уровней спама на несколько управляемом уровне, но не более.

И, наконец, я хочу вернуться к решениям на основе изображений: вам не нужно каждый раз создавать новый образ. Вы можете предварительно создать большое их количество (может быть, несколько тысяч?), А затем постепенно менять этот набор с течением времени. Например, истекайте срок действия 100 самых старых изображений каждые 10 минут или каждый час и заменяйте их набором новых. Для каждого запроса случайным образом выбирайте CAPTCHA из общего набора.

Конечно, это не выдержит направленной атаки, но, как упоминалось здесь много раз, большинство CAPTCHA не будут. Впрочем, этого будет достаточно, чтобы остановить случайного бота.

Я бы сделал простую капчу на основе времени.

JavaScript включен: Проверьте время публикации минус время загрузки больше, чем HUMANISVERYFASTREADER.

JavaScript отключен: время начала HTTP-запроса минус время окончания HTTP-ответа (сохранение в сеансе или в скрытом поле), превышающее HUMANISVERYFASTREADER плюс NETWORKLATENCY, умноженное на 2.

В любом случае, если он возвращает true, вы перенаправляете изображение CAPTCHA. Это означает, что большую часть времени людям не придется использовать изображение CAPTCHA, если только они не очень быстро читают или спам-бот настроен на задержку ответа.

Обратите внимание, что при использовании скрытого поля я бы использовал для него случайное имя в случае, если бот обнаружит, что оно используется в качестве CAPTCHA, и попытается изменить значение.

Другой совершенно другой подход (который работает только с JavaScript) - это использование функции jQuery Sortable, чтобы позволить пользователю сортировать несколько изображений. Может быть, небольшая головоломка 3х3.

Кто сказал, что вы должны создавать все изображения на сервере с каждым запросом? Может быть, вы могли бы иметь статический список изображений или вытащить их из Flickr. Мне нравится идея "нажми на котенка". http://www.thepcspy.com/kittenauth

Я использовал http://stopforumspam.com/ в качестве первой линии защиты от ботов. На сайтах, которые я реализовал, на нем останавливается практически все спамеры без использования CAPTCHA.

Университет reCAPTCHA спонсирует и помогает оцифровывать книги.

Мы генерируем и проверяем искаженные изображения, поэтому вам не нужно запускать дорогостоящие программы генерации изображений.

В моем блоге я не принимаю комментарии, если не включен javascript, и публикую их через ajax. Не подпускает всех ботов. Единственный спам, который я получаю - от спамеров-людей (которые обычно копируют и вставляют текст с сайта, чтобы сгенерировать комментарий).

Если вам нужна версия без javascript, сделайте что-то вроде:

[некоторая операция] из [x] в следующей строке [y]

учитывая достаточно сложные [x] и [y], которые не могут быть решены с помощью регулярного выражения, было бы трудно написать парсер

посчитать количество коротких слов в [собака, опасная, танцевальная, кошка] = 2

какое самое короткое слово в [собака, опасная, танцевальная, катастрофа] = собака

какое слово заканчивается на x в [fish,mealy,box,stackru] = box

какой URL является недопустимым в [apple.com, stackru.com, fish oil.com] = fish oil.com

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

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

Если ваш сайт популярен (например, Stackru), и люди, которые любят кодировать, висят на нем (например, Stackru), есть вероятность, что кто-то примет "сломать капчу" как вызов, который легко выиграть с помощью простого javascript + greasemonkey.

Так, например, подход к скрытым разноцветным буквам, предложенный где-то в потоке (действительно классная идея, идея), может быть легко нарушен простым анализом следующей строки примера:

<div id = "captcha">
 <span class = "red">s</span>
 asdasda
 <span class = "red">t</span>
 asdff
 <span class = "red">a</span>
 jeffwerf
 <span class = "red">c</span>
 sdkk
 <span class = "red">k</span>
</div>

То же самое, разбирать это легко:

3 + 4 = ?

Если это следует схеме (х + у) или тому подобное.

Точно так же, если у вас есть множество вопросов (what color is an orange?, how many dwarves surround snowwhite?), если у вас их нет тысяч, можно выбрать около 30, создать хэш вопросов и ответов и заставить бот-скрипт перезагружать страницу, пока не будет найден один из 30.

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

Пример, связанный с переполнением стека:

Сколько очков репутации у пользователя XYZ?

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

Более общий пример: где вы живете? Какие были погодные условия в 9:00 в субботу, где вы живете? Подсказка: используйте Yahoo погоды и обеспечьте влажность и общие условия.

Затем пользователь вводит свой ответ

Сиэтл Небольшая облачность, 85% влажность

Компьютер подтверждает, что это были действительно те погодные условия в Сиэтле в то время.

Ответ уникален для пользователя, но сервер может найти и подтвердить этот ответ.

Типы вопросов могут быть разными. Но идея состоит в том, что вы выполняете некоторую обработку комбинации фактов, которые должен был бы найти человек, а сервер мог бы просто искать. Процесс состоит из двух частей диалога и требует определенного уровня взаимопонимания. Это своего рода тест на обратный поворот. Пусть человек докажет, что может предоставить вычислимую часть данных, но для получения вычислимых данных нужны человеческие знания.

Еще одна возможная реализация. Как тебя зовут и когда ты родился?

Человек предоставит известный ответ, и компьютер сможет найти информацию в базе данных.

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

Я уверен, что в реализации есть недостатки и детали, которые нужно проработать. Но концепция кажется здравой. Пользователь предоставляет комбинацию фактов, которые сервер может искать, но сервер имеет контроль над типами комбинаций, которые следует запрашивать. Комбинации могут быть рандомизированы, и сервер может использовать различные стратегии для поиска общего ответа. Реальная выгода в том, что вы просите пользователя предоставить своего рода профилирование и откровение себя в своем ответе. Это усложняет систематическую работу ботов. Группа компьютеров начинает использовать одни и те же ответы на многих серверах и в таких формах, как

Я робот, 1972 года рождения в 15:45.

Затем такой ответ может быть профилирован и использован всей сетью для блокировки ботов, что эффективно делает автоматизацию бесполезной после нескольких итераций.

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

Разве этот пост говорил о технологии фиолетового капчи? Ответ со стороны сервера (ложь, нет)

Это был пост о капчах? Ответ со стороны сервера (правда, да)

Это был пост о Майкле Джексоне? Ответ со стороны сервера (ложь, нет)

Представляется полезным представить несколько вопросов в случайном порядке и сделать порядок значимым. например, выше будет = нет, да, нет. Перемешайте порядок и смешайте бессмысленные вопросы с ответами "нет" и "да".

Как насчет CAPTCHA на основе CSS?

<div style="position:relative;top:0;left:0">
<span style="position:absolute;left:4em;top:0">E</span>
<span style="position:absolute;left:3em;top:0">D</span>
<span style="position:absolute;left:1em;top:0">B</span>
<span style="position:absolute;left:0em;top:0">A</span>
<span style="position:absolute;left:2em;top:0">C</span>
</div>

Это отображает "ABCDE". Конечно, все еще легко обойтись с помощью специального бота.

Пожалуйста, позвоните ххххх ххххххх, и давайте поговорим о погоде у вас.

Но в наши дни это слишком быстро и слишком ориентировано на получение прибыли, что даже один телефонный звонок с выбранным нами поставщиком услуг будет слишком дорогим для провайдера (время драгоценное).

Мы согласились говорить большую часть нашего времени с машинами.

Грустные времена...

Mixriot.com использует ASCII art CAPTCHA (не уверен, что это сторонний инструмент).

 OooOOo  .oOOo.  o   O    oO   
 o       O       O   o     O   
 O       o       o   o     o   
 ooOOo.  OoOOo.  OooOOo    O   
      O  O    O      O     o   
      o  O    o      o     O   
 `OooO'  `OooO'      O   OooOO

Как насчет того, чтобы сделать капчу с буквами разных цветов и попросить пользователя ввести только буквы определенного цвета?

А как насчет отображения каптч с использованием таких элементов HTML, как div? Буквы из прямоугольных областей легко строить, и их сложно анализировать.

Просто будьте осторожны с культурным уклоном в любом вопросе, основанном на CAPTCHA.

Предвзятость в тестировании интеллекта

У меня было множество проблем со спамом на сайте phpBB 2.0, который я запускал некоторое время назад (сайт сейчас обновлен).

Я установил собственный мод капчи, который я нашел на форумах pbpBB, который работал хорошо в течение некоторого времени. Я обнаружил, что реальным решением было объединить это с дополнительными "обязательными" полями [на странице создания учетной записи].
Я добавил; Расположение и профессия (обыденная, но удобная в использовании).
Бот никогда не пытался заполнить их, все же предполагая, что капча была точкой отказа для каждой попытки.

Вы смотрели на Waegis?

"Waegis - это онлайн-сервис, который предоставляет открытый API (интерфейс программирования приложений). Он получает входящие данные с помощью методов API, применяет быструю проверку и своевременно идентифицирует спам и легитимный контент. Затем он возвращает результат клиенту, чтобы указать, контент спам или нет."

Если основная проблема, связанная с неиспользованием изображений для капчи, заключается в загрузке ЦП при создании этих изображений, возможно, было бы неплохо найти способ создания этих изображений, когда загрузка ЦП "мала" (условно говоря). Нет причин, по которым изображение с картинки должно быть создано одновременно с формой. Вместо этого вы можете извлечь из большого кэша капч, сгенерированный в последний раз, когда загрузка сервера была "легкой". Вы можете даже повторно использовать кэшированные капчи (в случае, если в отправке форм есть странный всплеск), пока вы не создадите кучу новых в следующий раз, когда загрузка сервера станет "легкой".

Я кодировал довольно большой новостной сайт, возился с капчами и анализировал спам-роботов.

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


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


Еще одна хорошая система кодирования, которую я видел, была создана WebDesignBeach.
У вас есть несколько объектов, и вы должны перетащить один в определенную зону. Довольно оригинально, не правда ли?

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

Это будет за подписку, а не за пост, верно? Потому что это просто убило бы сайт, даже с автоматизацией jQuery.

Лучшие системы CAPTCHA - это те, которые злоупотребляют проблемами P=NP в информатике. Проблема естественного языка, вероятно, самая лучшая, а также самая легкая из этих проблем, которую можно злоупотреблять. Любой вопрос, на который можно ответить простым Google-запросом с небольшим рассмотрением (например, "Какая вторая планета в нашей солнечной системе?" - хороший вопрос, а 2 + 2 = "нет") - достойный кандидат в этой ситуации.

Не техническое решение, а теоретическое.

1. Слово или звук дается. "Переместите мышь в верхний левый угол экрана и нажмите на оранжевую кнопку" или "Нажмите здесь, а затем нажмите здесь" (требуется многоэтапный ответ). Когда задачи выполнены, проблема решена. Выберите объекты, которые уже находятся на странице, чтобы они нажимали. Выполните хотя бы два действия.

Надеюсь это поможет.

Исправление синтаксической ошибки CAPTCHA:

echo "Hello, world!;
for (int $i = 0; $i < 10; $i ++ {
  echo $i /*
}

Парены и кавычки удаляются случайным образом.

Боты могут автоматически проверять синтаксические ошибки, но они не знают, как их исправить!

Даже с репутацией все еще должен быть НЕКОТОРЫЙ тип капчи, чтобы предотвратить атаку вредоносного скрипта.

Используйте простой текст CAPTCHA и затем попросите пользователей ввести ответ в обратном порядке или только первую букву, или последнюю, или другую случайную вещь.

Другая идея состоит в том, чтобы сделать изображение ASCII, как это (из конечной последовательности игры Portal):

                             .,---.
                           ,/XM#MMMX;,
                         -%##########M%,
                        -@######%  $###@=
         .,--,         -H#######$   $###M:
      ,;$M###MMX;     .;##########$;HM###X=
    ,/@##########H=      ;################+
   -+#############M/,      %##############+
   %M###############=      /##############:
   H################      .M#############;.
   @###############M      ,@###########M:.
   X################,      -$=X#######@:
   /@##################%-     +######$-
   .;##################X     .X#####+,
    .;H################/     -X####+.
      ,;X##############,       .MM/
         ,:+$H@M#######M#$-    .$$=
              .,-=;+$@###X:    ;/=.
                     .,/X$;   .::,
                         .,    ..  

И дать пользователю несколько вариантов, таких как: IS A, LIE, BROKEN HEART, CAKE.

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

  1. Математика: 2+5 = _
  2. Наименование: животное на этой фотографии ____
  3. Противоположности: противоположность счастья ___
  4. Завершение: корова идет _____

Мое решение состояло в том, чтобы поместить форму на отдельной странице и передать ей отметку времени. На этой странице я отображаю форму только в том случае, если отметка времени действительна (не слишком быстрая и не слишком старая). Я обнаружил, что боты всегда будут попадать на страницу регистрации напрямую, и только люди будут перемещаться туда правильно.

Не будет работать, если у вас есть форма на самой странице контента, как у вас сейчас, но вы можете показать / скрыть ссылку на специальную страницу отправки на основе NoScript. Небольшое неудобство для такого небольшого процента пользователей.

Я уверен, что большинство страниц создаются с элементами управления (кнопки, ссылки и т. Д.), Которые поддерживают наведение мыши.

  • Вместо того, чтобы показывать изображения и просить пользователя ввести контент, попросите пользователя навести курсор мыши на любой элемент управления (выберите элемент управления в произвольном порядке (любая кнопка или ссылка)).
  • И применить цвет к элементу управления (некоторый случайный цвет) при наведении курсора мыши (маленький JavaScript делает свое дело)..
  • затем позвольте пользователю ввести цвет, который он / она видели при наведении мыши.

Это просто другой подход, я на самом деле не реализовывал этот подход. Но это возможно.

Другие вопросы по тегам