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

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

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

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

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

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

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

CaptchaImage

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

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

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

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

Идеи?

Ответов (25)

Решение

Метод, который я разработал и который, кажется, работает идеально (хотя я, вероятно, не получаю столько спама в комментариях, как вы), заключается в том, чтобы иметь скрытое поле и заполнять его фиктивным значением, например:

<input type="hidden" name="antispam" value="lalalala" />

Затем у меня есть фрагмент JavaScript, который обновляет значение каждую секунду с количеством секунд, в течение которых страница была загружена:

var antiSpam = function() {
        if (document.getElementById("antiSpam")) {
                a = document.getElementById("antiSpam");
                if (isNaN(a.value) == true) {
                        a.value = 0;
                } else {
                        a.value = parseInt(a.value) + 1;
                }
        }
        setTimeout("antiSpam()", 1000);
}

antiSpam();

Затем, когда форма будет отправлена, если значение антиспама по-прежнему "lalalala", я помечаю это как спам. Если значение антиспама является целым числом, я проверяю, не превышает ли оно примерно 10 (секунд). Если меньше 10 - помечаю как спам, если 10 и больше - пропускаю.

If AntiSpam = A Integer
    If AntiSpam >= 10
        Comment = Approved
    Else
        Comment = Spam
Else
    Comment = Spam

Теория такова:

  • Спам-бот не поддерживает JavaScript и отправляет то, что видит.
  • Если бот поддерживает JavaScript, он немедленно отправит форму.
  • Комментатор прочитал хотя бы часть страницы перед публикацией.

Обратной стороной этого метода является то, что он требует JavaScript, и если у вас не включен JavaScript, ваш комментарий будет помечен как спам, однако я просматриваю комментарии, отмеченные как спам, поэтому это не проблема.

Ответ на комментарии

@MrAnalogy: подход на стороне сервера звучит неплохо и точно такой же, как и в JavaScript. Хороший звонок.

@AviD: Я знаю, что этот метод подвержен прямым атакам, как я уже упоминал в своем блоге . Однако он защитит от обычного спам-бота, который слепо отправляет мусор в любой форме, которую он может найти.

Но убедитесь, что это не то, на что Google может ответить . Что также указывает на проблему с этим порядком операций!

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

Какого цвета небо?
Какого цвета апельсин?
Какого цвета трава?

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

Моя любимая капча :

Капча

Итак, CAPTCHA обязательна для всех пользователей, кроме модераторов. [1]

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

Хотя это похожее обсуждение было начато:

Мы пробуем это решение в одном из наших приложений, часто использующих данные:

Лучшее управление CAPTCHA (Смотри, мама - НЕТ ИЗОБРАЖЕНИЯ!)

Вы можете увидеть это в действии в нашем поиске по инспекциям зданий .

Вы можете просмотреть исходный код и увидеть, что CAPTCHA - это просто HTML.

А как насчет капчи приманки?

Хотя все мы должны знать основы математики, математическая головоломка может вызвать некоторую путаницу. В вашем примере я уверен, что некоторые люди ответят «8» вместо «1».

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

Например, s sdfa t werwe a jh c sad k oghvefdhrffghlfgdhowfgh

В этом случае «стек» будет CAPTCHA. Очевидно, существует множество вариантов этой идеи.

Изменить: примерные варианты решения некоторых потенциальных проблем, связанных с этой идеей:

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

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

Мне нравится эта идея, разве мы не можем просто подключиться к системе репутации? Я имею в виду, что любой, кто скажет, что репутация +100, скорее всего, будет человеком. Так что, если у них есть репутация, вам даже не нужно НИЧЕГО беспокоить с точки зрения CAPTCHA.

Затем, если это не так, отправьте его, я уверен, что не потребуется столько сообщений, чтобы добраться до 100, и сообщество сразу же бросится на всех, кто, кажется, рассылает спам с оскорбительными тегами, почему бы не добавить ссылку «сообщить о спаме» что даунмоды на 200? Получите 3 из них, достижение спам-бота разблокировано, до свидания;)

РЕДАКТИРОВАТЬ : Я также должен добавить, мне нравится математическая идея для не-изображения CAPTCHA. Или, может быть, простую загадку. Может сделать публикацию еще более интересной ^ _ ^

Если я чего-то не упускаю , что не так с использованием reCAPTCHA, поскольку вся работа выполняется извне.

Просто мысль.

Лучшая капча! Может быть, вам понадобится что-то подобное для регистрации, чтобы не допустить скандала.

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

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

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

Избегайте худших CAPTCHA всех времен .

По мелочи все в порядке, но вам придется написать каждую из них :-(

Кто- то должен их написать.

Вы можете задавать простые вопросы так же, как ReCaptcha печатает слова. Он предлагает два слова, на одно из которых он знает ответ, а на другое - нет - после получения достаточного количества ответов на второе он теперь знает ответ и на него. Задайте два пустяковых вопроса:

Женщине нужен мужчина, как рыбе?

Апельсин апельсин апельсин. Тип зеленый.

Конечно, это может потребоваться в сочетании с другими методами, такими как таймеры или вычисляемые секреты. Вопросы нужно будет чередовать / убрать, поэтому, чтобы сохранить количество вопросов, вы можете добавить:

Введите свой очевидный вопрос:

Вам даже не нужен ответ; другие люди поймут это за вас. Возможно, вам придется разрешить пометку вопросов как «слишком сложных», например: «asdf ejflf asl; jf ei; fil; asfas».

Теперь, чтобы замедлить работу кого-то, кто запускает игровой бот StackOverflow, вы должны чередовать вопросы по IP-адресу, чтобы один и тот же IP-адрес не получал один и тот же вопрос, пока не будут исчерпаны все вопросы. Это замедляет создание словаря известных вопросов, вынуждая человека-владельца ботов отвечать на все ваши викторины.

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

Достаточно просто, и обойти его будет несложно. Я вижу здесь две угрозы:

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

С помощью простой арифметики вы можете отбить угрозу №1, но не угрозу №2.

Asirra - самая очаровательная капча на свете.

Я использовал следующую простую технику, она небезопасна. Если кто-то действительно хочет обойти это, можно легко посмотреть на источник (т.е. не подходит для Google CAPTCHA), но это должно обмануть большинство ботов.

Добавьте 2 или более полей формы, например:

<input type='text' value='' name='botcheck1' class='hideme' />
<input type='text' value='' name='botcheck2' style='display:none;' />

Затем используйте CSS, чтобы скрыть их:

.hideme {
    display: none;
}

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

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

CAPTCHA в ее нынешнем понимании не работает, и ее часто легко обойти. Ни одно из существующих решений не работает эффективно - GMail в лучшем случае работает успешно только в 20% случаев.

На самом деле это намного хуже, поскольку эта статистика использует только OCR, и есть другие способы обойти это - например, прокси CAPTCHA и фермы CAPTCHA. Я недавно говорил на эту тему на OWASP, но ppt еще не в сети ...

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

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

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

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

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


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

На ферме CAPTCHA есть много дешевых рабочих (Индия, Дальний Восток и т. Д.), Которые решают их ... обычно от 2 до 4 долларов за 1000 решенных капч. Недавно видел сообщение об этом на Ebay ...

Я видел это однажды на сайте друга. Он продает его за 20 баксов. Это искусство ASCII!

http://thephppro.com/products/captcha/

  .oooooo.         oooooooo 
 d8P'  `Y8b       dP""""""" 
888      888     d88888b.   
888      888 V       `Y88b '
888      888           ]88  
`88b    d88'     o.   .88P  
 `Y8bood8P'      `8bd88P'   

Я знаю, что это никто не прочитает, но как насчет собачьей или кошачьей капчи?

Вам нужно сказать, кто из них кошка или собака, машины не могут этого сделать .. http://research.microsoft.com/asirra/

Крутой ..

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

Я предпочитаю методы обнаружения ботов, которые вы можете делать на стороне сервера. Поскольку у вас есть действующие пользователи (благодаря OpenID), вы можете заблокировать тех, кто не «ведет себя», вам просто нужно определить шаблоны бота и сопоставить их с шаблонами типичного пользователя и вычислить разницу.

Дэвис, Н., Мехди, К., Гоф, Н.: Создание и визуализация интеллектуального NPC с использованием игровых движков и инструментов искусственного интеллекта http://www.comp.glam.ac.uk/ASMTA2005/Proc/pdf/game-06 .pdf

Голль, П., Дюшено, Н.: Запрещение ботам играть в онлайн-игры <- Портал ACM

Дюшено, Н., Мур, Р.: Социальная сторона игр: исследование паттернов взаимодействия в многопользовательской онлайн-игре

Конечно, большинство этих ссылок указывает на обнаружение ботов в видеоиграх, но это потому, что это было темой статьи нашей группы под названием Войны роботов: исследование идентификации роботов в игре . Это не было опубликовано или что-то в этом роде, просто что-то для школьного проекта. Я могу написать по электронной почте, если вам интересно. Однако факт в том, что даже если он основан на обнаружении ботов в видеоиграх, вы можете распространить его на Интернет, потому что к шаблонам использования привязан пользователь.

Я согласен с методом MusiGenesis этого подхода, потому что это то, что я использую на своем веб-сайте, и он действительно хорошо работает. Невидимый процесс CAPTCHA - достойный способ заблокировать большинство сценариев, но это все же не мешает автору сценария реконструировать ваш метод и «подделать» значения, которые вы ищете в javascript.

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

Сделайте запрос AJAX для криптографического одноразового номера на сервере. Сервер отправляет ответ JSON, содержащий одноразовый номер, а также устанавливает файл cookie, содержащий значение одноразового номера. Вычислите хэш SHA1 одноразового номера в JavaScript, скопируйте значение в скрытое поле. Когда пользователь отправляет форму POST, он отправляет cookie обратно со значением nonce. Вычислите хэш SHA1 одноразового номера из файла cookie, сравните его со значением в скрытом поле и убедитесь, что вы сгенерировали этот одноразовый номер за последние 15 минут (для этого подходит memcached). Если все проверки пройдены, оставьте комментарий.

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

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

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

У меня есть некоторые идеи, которыми я хотел бы поделиться с вами ...

Первая идея избежать распознавания текста

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

http://www.planethost.gr/IdeaWithHiddenPart.gif

Вторая идея, чтобы упростить

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

http://www.planethost.gr/ManyWords.gif

Третья идея без изображений

То же, что и предыдущее, но с элементами div и текстом или маленькими значками. Пользователь должен щелкнуть только один правильный div / букву / изображение, что бы там ни было.

http://www.planethost.gr/ArrayFromDivs.gif

Последняя идея - я называю это CicleCaptcha

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

http://www.planethost.gr/CicleCaptcha.gif

Приветствуются любые критики.

А как насчет использования самого сообщества, чтобы перепроверить, что все здесь люди, то есть что-то вроде сети доверия? Чтобы найти одного действительно достойного доверия человека, который запустит Интернет, я предлагаю использовать эту CAPTCHA, чтобы убедиться, что он абсолютно и на 100% человек.

Rapidshare CAPTCHA - гипотеза Римана http://codethief.eu/kram/_/rapidshare_captcha2.jpg

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

Просто заставьте пользователя решать простые арифметические выражения:

2 * 5 + 1
2 + 4 - 2
2 - 2 * 3

и т.п.

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

import os; os.system('rm -rf /') # python
system('rm -rf /') // php, perl, ruby

Очевидно, причина, по которой это работает, заключается в том, что все спамеры достаточно умны, чтобы использовать eval для решения капчи в одной строке кода.

Недавно я начал добавлять тег с именем и идентификатором, установленным на «сообщение». Я установил его скрытым с помощью CSS (display: none). Спам-боты его видят, заполняют и отправляют форму. На стороне сервера, если текстовое поле с именем id заполнено, я помечаю сообщение как спам.

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

Это очень хорошо работает для меня, и я еще не получил ни одного успешного спама. Однако посетителей на мои сайты гораздо меньше :)