Практические подходы CAPTCHA без изображений?
Похоже, мы добавим поддержку CAPTCHA в Stack Overflow. Это необходимо для предотвращения действий ботов, спамеров и других вредоносных скриптов. Мы только хотим, чтобы люди публиковали или редактировали здесь!
Мы будем использовать JavaScript (jQuery) CAPTCHA в качестве первой линии защиты:
http://docs.jquery.com/Tutorials:Safer_Contact_Forms_Without_CAPTCHAs
Преимущество этого подхода в том, что для большинства людей CAPTCHA никогда не будет видна!
Тем не менее, для людей с отключенным JavaScript нам все еще нужен запасной вариант, и здесь он становится сложным.
Я написал традиционный элемент управления CAPTCHA для ASP.NET, который мы можем использовать повторно.
Однако я предпочел бы пойти с чем-то текстовым, чтобы избежать накладных расходов на создание всех этих изображений на сервере с каждым запросом.
Я видел такие вещи, как..
- ASCII текстовая капча:
\/\/(_)\/\/
- математические головоломки: что такое 7 минус 3 раза 2?
- пустяковые вопросы: что вкуснее, жаба или эскимо?
Может быть, я просто склоняюсь к ветряным мельницам здесь, но я хотел бы иметь менее ресурсоемкий, не основанный на изображениях <noscript>
совместимая капча, если это возможно.
Идеи?
103 ответа
Метод, который я разработал и который, кажется, работает отлично (хотя я, вероятно, не получаю так много спама в комментариях, как вы), должен иметь скрытое поле и заполнить его фиктивным значением, например:
<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: я знаю, что этот метод подвержен прямым атакам, как я уже упоминал в своем блоге. Тем не менее, он будет защищать от вашего обычного спам-бота, который слепо подает мусор в любую форму, которую сможет найти.
Если я что-то упустил, что не так с использованием reCAPTCHA, так как вся работа выполняется внешне.
Просто мысль.
Преимущество этого подхода в том, что для большинства людей CAPTCHA никогда не будет видна!
Мне нравится эта идея, нет ли способа, которым мы можем просто подключиться к системе повторений? Я имею в виду, что любой, кто скажет +100, может быть человеком. Так что, если у них есть репутация, вам даже не нужно делать что-либо с точки зрения CAPTCHA.
Затем, если это не так, отправьте его, я уверен, что не потребуется столько сообщений, чтобы добраться до 100, и сообщество мгновенно погрузится в тех, кто, кажется, спамит оскорбительными тегами, почему бы не добавить ссылку "сообщить о спаме" что снизит на 200? Получить 3 из них, достижение спамбот разблокировано, пока пока;)
РЕДАКТИРОВАТЬ: Я должен также добавить, мне нравится математическая идея для CAPTCHA без изображения. Или, может быть, простая вещь типа загадки. Может сделать публикацию еще интереснее ^_^
Избегайте худших капч за все время.
Мелочи в порядке, но вам придется написать каждый из них:-(
Кто-то должен был бы написать их.
Вы можете задавать пустяковые вопросы так же, как ReCaptcha печатает слова. Он предлагает два слова, одно из которых знает ответ, другое - нет - после достаточного количества ответов на второе, теперь он тоже знает ответ. Задайте два пустяковых вопроса:
А женщине нужен мужчина, как рыбе нужен?
Оранжевый оранжевый оранжевый. Типа зеленый.
Конечно, это может потребоваться в сочетании с другими методами, такими как таймеры или компьютерные секреты. Вопросы нужно будет переворачивать / удалять, поэтому, чтобы сохранить количество вопросов, вы могли бы добавить:
Введите очевидный вопрос:
Вам даже не нужен ответ; другие люди поймут это для вас. Возможно, вам придется разрешить помечать вопросы как "слишком сложные", как этот: "asdf ejflf asl;jf ei;fil;asfas".
Теперь, чтобы замедлить кого-то, кто работает с игровым ботом Stackru, вы должны чередовать вопросы по IP-адресу, чтобы один и тот же IP-адрес не получал один и тот же вопрос, пока все вопросы не будут исчерпаны. Это замедляет создание словаря известных вопросов, вынуждая человека-владельца ботов отвечать на все ваши пустяковые вопросы.
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'
Итак, CAPTCHA обязателен для всех пользователей, кроме модераторов. [1]
Это невероятно глупо. Так что найдутся пользователи, которые могут редактировать любые посты на сайте, но без постов без капчи? Если у вас достаточно репутации для понижения сообщений, у вас достаточно репутации, чтобы оставлять посты без CAPTCHA. Сделайте это выше, если вам нужно. Кроме того, существует множество способов обнаружения спама без распознавания изображений, так что даже незарегистрированным пользователям никогда не потребуется заполнять эти заброшенные формы CAPTCHA.
Убедитесь, что это не то, что Google может ответить, хотя. Что также показывает проблему с этим - порядок операций!
Как насчет использования самого сообщества, чтобы перепроверить, что все здесь люди, то есть что-то вроде сети доверия? Чтобы найти действительно достойного доверия человека для запуска Интернета, я предлагаю использовать эту капчу, чтобы убедиться, что он абсолютно и на 100% человек.
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
решить капчу в одной строке кода.
Я использовал следующую простую технику, она не надежна. Если кто-то действительно хочет обойти это, легко взглянуть на источник (то есть не подходит для 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 и пытаться заполнить каждое поле формы, тогда как люди не увидят поля ввода и не оставят их в покое.
Очевидно, есть еще много вещей, которые вы можете сделать, чтобы сделать это менее пригодным для использования, но это лишь базовая концепция.
Хотя мы все должны знать основную математику, математическая загадка может вызвать некоторую путаницу. В вашем примере я уверен, что некоторые люди ответили бы "8" вместо "1".
Подойдет ли простая строка текста со случайными символами, выделенными жирным шрифтом или курсивом? Пользователь просто должен ввести жирный / курсивный буквы в качестве капчи.
Например, мы не можем это сделать.
В этом случае "стек" будет CAPTCHA. Очевидно, что существует множество вариантов этой идеи.
Изменить: Пример вариантов для решения некоторых потенциальных проблем, связанных с этой идеей:
- использование случайных цветных букв вместо полужирного / курсива.
- использование каждой второй красной буквы для CAPTCHA (уменьшает вероятность того, что боты идентифицируют буквы разного формата, чтобы угадать CAPTCHA)
Хотя это подобное обсуждение было начато:
Мы пробуем это решение в одном из наших часто используемых приложений:
Лучшее управление CAPTCHA (Смотри Ма - НЕ ИЗОБРАЖЕНИЕ!)
Вы можете увидеть это в действии в нашем Поиске Строительной инспекции.
Вы можете просмотреть Source и увидеть, что CAPTCHA - это просто HTML.
Я знаю, что никто не будет читать это, но как насчет собаки или кошки CAPTCHA?
Вы должны сказать, какая из них кошка или собака, машины не могут этого сделать. http://research.microsoft.com/asirra/
Это круто..
Лично мне не нравится CAPTCHA, это вредит удобству использования и не решает проблему безопасности, делающую недействительными действительных пользователей.
Я предпочитаю методы обнаружения ботов, которые вы можете использовать на стороне сервера. Поскольку у вас есть действительные пользователи (благодаря OpenID), вы можете блокировать тех, кто "не ведет себя", вам просто нужно идентифицировать шаблоны бота и сопоставить их с шаблонами обычного пользователя и рассчитать разницу.
Дэвис, Н., Мехди, В., Гоф, Н.: Создание и визуализация интеллектуального NPC с использованием игровых движков и инструментов ИИ http://www.comp.glam.ac.uk/ASMTA2005/Proc/pdf/game-06.pdf
Голле П., Дюшено, Н.: Предотвращение ботов играть в онлайн-игры <- ACM Portal
Ducheneaut N., Moore R.: Социальная сторона игр: изучение моделей взаимодействия в многопользовательской онлайн-игре
Конечно, большинство из этих ссылок указывают на обнаружение ботов в видеоиграх, но это потому, что это было темой статьи нашей группы под названием " Войны роботов: внутриигровое исследование идентификации роботов". Это не было опубликовано или что-то, просто что-то для школьного проекта. Я могу написать по электронной почте, если вы заинтересованы. Дело в том, что даже если он основан на обнаружении ботов в видеоиграх, вы можете обобщить его в Интернете, потому что есть пользователь, привязанный к шаблонам использования.
Я согласен с методом MusiGenesis этого подхода, потому что это то, что я использую на своем веб-сайте, и он работает прилично хорошо. Невидимый процесс CAPTCHA - это приличный способ блокировать большинство сценариев, но это не мешает сценаристу пересмотреть ваш метод и "подделать" значения, которые вы ищете в javascript.
Я скажу, что лучший способ состоит в том, чтобы: 1) установить пользователя, чтобы вы могли блокировать его, когда он плохой, 2) определить алгоритм, который обнаруживает типичные шаблоны по сравнению с нестандартными шаблонами использования веб-сайта, и 3) соответственно блокировать этого пользователя.
У меня есть некоторые идеи, которыми я хотел бы поделиться с вами...
Первая идея, чтобы избежать OCR
Капча, имеющая скрытую часть от пользователя, но полное изображение - это два кода вместе, поэтому программы OCR и фермы капчи считывают изображение, содержащее видимую и скрытую части, пытаются декодировать их обе и не могут отправить... - У меня есть все готовые исправить это и работать в Интернете.
http://www.planethost.gr/IdeaWithHiddenPart.gif
Вторая идея, чтобы сделать это проще
Страница со многими словами, которые человек должен выбрать правильно. Я также создал этот, просто. Слова являются кликабельными изображениями, и пользователь должен щелкнуть правой кнопкой мыши.
http://www.planethost.gr/ManyWords.gif
Третья идея без изображений
То же, что и предыдущий, но с элементами div и text или маленькими значками. Пользователь должен щелкнуть только на одном правильном div / букве / изображении, что когда-либо
http://www.planethost.gr/ArrayFromDivs.gif
Последняя идея - я называю это CicleCaptcha
И еще одна моя CicleCaptcha, пользователь должен найти точку на изображении. Если он найдет его и щелкнет по нему, то это человек, машины, возможно, выйдут из строя, или ему нужно создать новое программное обеспечение, чтобы найти способ с этим.
http://www.planethost.gr/CicleCaptcha.gif
Любые критики приветствуются.
Я просто использую простые вопросы, на которые каждый может ответить:
Какого цвета небо?
Какого цвета апельсин?
Какого цвета трава?
Это делает так, что кто-то должен настраивать бота на ваш сайт, что, вероятно, не стоит затраченных усилий. Если они это сделают, вы просто измените вопросы.
Лучшая капча! Может быть, вам нужно что-то вроде этого для регистрации, чтобы не допустить этого.
Недавно я начал добавлять тег с именем и идентификатором, установленным на "сообщение". Я установил его скрытым с помощью CSS (отображение: нет). Спам-боты видят его, заполняют и отправляют форму. На стороне сервера, если текстовое поле с идентификатором заполнено, я отмечаю сообщение как спам.
Другой метод, над которым я работаю, генерирует случайные имена и идентификаторы, некоторые из которых являются проверками на спам, а другие - обычными полями.
Это работает очень хорошо для меня, и я еще не получил никакого успешного спама. Тем не менее, я получаю гораздо меньше посетителей моих сайтов:)
Очень простая арифметика это хорошо. Слепые люди смогут ответить. (Но, как сказал Джарод, остерегайтесь приоритетов операторов.) Я полагаю, что кто-то может написать парсер, но это делает рассылку спама более дорогой.
Достаточно просто, и обойти его будет не сложно. Я вижу две угрозы здесь:
- случайные спам-боты и человеческие спам-боты, которые могут их поддерживать; а также
- боты, созданные в игре Stack Overflow
Используя простую арифметику, вы можете отбить угрозу № 1, но не угрозу № 2.
У меня были удивительно хорошие результаты с простым полем "Оставить это поле пустым:". Боты, кажется, заполняют все, особенно если вы называете поле что-то вроде "URL". В сочетании со строгой проверкой реферера, у меня еще не было бота.
Пожалуйста, не забывайте о доступности здесь. Общеизвестно, что капчи недоступны для многих людей, использующих программы чтения с экрана. Простые математические задачи или очень тривиальные мелочи (мне понравился вопрос "какого цвета небо") гораздо более дружелюбны для пользователей с нарушениями зрения.
Сделайте AJAX-запрос для криптографического одноразового номера на сервер. Сервер отправляет обратно ответ JSON, содержащий одноразовый номер, а также устанавливает файл cookie, содержащий значение одноразового номера. Рассчитайте хэш SHA1 для одноразового номера в JavaScript, скопируйте значение в скрытое поле. Когда пользователь отправляет форму POST, он теперь отправляет cookie обратно со значением nonce. Рассчитайте хэш SHA1 для одноразового номера из файла cookie, сравните его со значением в скрытом поле и убедитесь, что вы сгенерировали этот одноразовый номер за последние 15 минут (memcached подходит для этого). Если все эти проверки пройдены, оставьте комментарий.
Этот метод требует, чтобы спаммер садился и выяснял, что происходит, и, как только они это сделают, им все равно придется запускать несколько запросов и поддерживать состояние cookie, чтобы получить комментарий. Плюс они только когда-либо видят Set-Cookie
заголовок, если они анализируют и выполняют JavaScript в первую очередь и делают запрос AJAX. Это намного, гораздо больше работы, чем большинство спамеров готовы пройти, тем более что работа относится только к одному сайту. Самым большим недостатком является то, что любой, у которого отключен JavaScript или отключены файлы cookie, помечается как потенциальный спам. Это означает, что очереди на модерацию все еще хорошая идея.
Теоретически, это может рассматриваться как безопасность через неизвестность, но на практике это отлично.
Я никогда не видел, чтобы спаммер пытался сломать эту технику, хотя, может быть, раз в пару месяцев я получаю запись спама по теме, вводимую вручную, и это немного жутко.
На самом деле это может быть идея иметь набор кодов, связанных с программированием. Например:
Существует возможность того, что кто-то создаст проверку синтаксиса, чтобы обойти это, но гораздо больше работы, чтобы обойти капчу. Вы получаете идею иметь связанную капчу, хотя.
1) Человеческие решатели
Все упомянутые здесь решения обойдены подходом человека решателей. Профессиональный спамбот поддерживает сотни соединений, и, когда он не может решить саму CAPTCHA, он передает снимок экрана удаленному человеку.
Я часто читаю, что человеческие решатели капч нарушают законы. Ну, это написано теми, кто не знает, как работает эта (спамовая) отрасль.
Люди-решатели напрямую не взаимодействуют с сайтами, которые CAPTCHA решают. Они даже не знают, с каких сайтов были взяты и отправлены капчи. Мне известно о десятках (если не сотнях) компаний и / или веб-сайтах, предлагающих услуги по поиску людей, но ни одной о прямом взаимодействии с досками не работает.
Последние не нарушают никаких законов, поэтому решение CAPTCHA является полностью легальным (и официально зарегистрированным) бизнесом компании. Они не имеют преступных намерений и могут, например, использоваться для дистанционного тестирования, расследований, проверки концепции, прототипа и т. Д.
2) Контекстный спам
Боты AI (искусственный интеллект) определяют контексты и поддерживают контекстно-зависимые диалоги в разное время с разных IP-адресов (разных стран). Даже авторы блогов часто не понимают, что комментарии от ботов. Я не буду вдаваться в подробности, но, например, боты могут создавать человеческие диалоги, сохранять их в базе данных, а затем просто повторно использовать их (фраза за фразой), чтобы они не были обнаружены как спам программным обеспечением или даже людьми.
Самый голосующий ответ говорит:
- * "Теория такова:
- Спам-бот не будет поддерживать JavaScript и отправит то, что видит
- Если бот поддерживает JavaScript, он отправит форму мгновенно
- Комментатор, по крайней мере, прочитал часть страницы перед публикацией "*
а также honeypot-ответ, и большинство ответов в этой теме просто неверны.
Я полагаю, что они обречены на жертвы
Большинство спам-ботов работают через локальные и удаленные браузеры, поддерживающие javascript (исправленные и управляемые) с разных IP-адресов (разных стран), и они достаточно умны, чтобы обходить ловушки для меда и медовые банки.
Другая проблема заключается в том, что даже владельцы блогов не могут часто обнаруживать, что комментарии принадлежат ботам, поскольку они на самом деле основаны на диалогах людей и комментариях, собранных с других веб-форумов (форумов, комментариев блогов и т. Д.)
3) Концептуально новый подход
Извините, я удалил эту часть как осажденную
Что делать, если вы использовали комбинацию идей капчи, которые у вас были (выберите любую из них - или выберите одну из них случайным образом):
- ASCII текстовая капча: //(_)//
- математические головоломки: что такое 7 минус 3 раза 2?
- пустяковые вопросы: что вкуснее, жаба или эскимо?
с добавлением размещения той же самой капчи в скрытом разделе css страницы - идея приманки. Таким образом, у вас будет одно место, где вы ожидаете правильный ответ, и другое, где ответ должен быть неизменным.
Простой текст звучит великолепно. Подкупите сообщество, чтобы сделать работу! Если вы, как и я, считаете, что точки SO SO измеряют стремление пользователя помочь сайту успешно развиваться, вполне разумно предлагать очки репутации, чтобы защитить сайт от спамеров.
Предложите +10 репутации за каждый вклад простого вопроса и набора правильных ответов. Вопрос должен подходить далеко (отредактируйте расстояние) от всех существующих вопросов, и репутация (и вопрос) должны постепенно исчезать, если люди не могут ответить на него. Допустим, если процент отказов при правильных ответах превышает 20%, отправитель теряет одно очко репутации за неправильный ответ, максимум до 15. Таким образом, если вы отправите неправильный вопрос, вы получите +10 сейчас, но в конечном итоге вы будете нетто -5. Или, может быть, имеет смысл задать вопрос пользователям, проголосовавшим, является ли вопрос с проверкой капчи хорошим.
Наконец, подобно ежедневному ограничению повторений, допустим, что ни один пользователь не может заработать более 100 репутаций, отправляя контрольные вопросы. Это разумное ограничение на вес, придаемый таким вкладам, и это также может помочь предотвратить спаммеры, чтобы засадить вопросы в систему. Например, вы можете выбирать вопросы не с равной вероятностью, а с вероятностью, пропорциональной репутации отправителя. Джон Скит, пожалуйста, не задавайте никаких вопросов:-)
Я должен признать, что у меня нет опыта борьбы со спам-ботами, и я не знаю, насколько они сложны. Тем не менее, я не вижу ничего в статье jQuery, что не может быть выполнено исключительно на сервере.
Чтобы перефразировать резюме из статьи jQuery:
- При создании контактной формы на сервере...
- Хватай текущее время.
- Объедините эту временную метку плюс секретное слово, сгенерируйте 32-х символьный хэш и сохраните его в виде файла cookie в браузере посетителя.
- Храните хэш или метку времени в скрытом теге формы.
- Когда форма отправляется обратно, значение временной метки будет сравниваться с 32-символьным "токеном", хранящимся в cookie.
- Если информация не совпадает или отсутствует, или если отметка времени слишком старая, остановите выполнение запроса...
Другой вариант, если вы хотите использовать традиционный образ CAPTCHA без дополнительных затрат на их генерацию при каждом запросе, - это предварительно генерировать их в автономном режиме. Тогда вам просто нужно случайно выбрать один для отображения с каждой формой.