CAPTCHA: убивая конверсию / Хабр
Капча считается международным стандартом защиты от DDoS-атак, автоматических регистраций и спама. Мы в Variti проанализировали эффективность этого решения и пришли к заключению, что это очень неудобное и малоэффективное средство защиты от ботов, плохо влияющее на конверсию, а области с капчей — это сами по себе уязвимые места для атак.
Мы решили поделить причины, по которой от капчи надо избавляться в пользу более надежных и менее раздражающих пользователей решений, на маркетинговые и технические.
Маркетинговые
Бесит!Капчу необходимо внимательно разглядывать и периодически вводить несколько раз. Исследование Стэнфорда говорит о том, что их испытуемые в среднем тратили 9.8 секунд, чтобы распознать и ввести визуальную капчу и 28.4 секунды на аудио-версию, причем 50% пользователей отказались ее решать. В 2018 году Baymard Institute, который проводит различные исследования на тему UX, подсчитал, что пользователи не могут решать текстовые CAPTCHA примерно в 8% случаев.
Прежде всего, это все-таки проблема юзабилити, поскольку эта функциональность заставляет пользователя выполнять лишнее действие (а плюс к этому капча не всегда уместно и красиво выглядит в дизайне страницы). Особенно четко это проблема проявляется, если при неправильном вводе решения перезагружается вся страница целиком: например, если пользователь долго набирал длинный комментарий, а потом он пропал при неверном решении. Процент вероятности того, что человек начнет все заново, не очень велик.
Помимо этого, на рынке уже существует несколько решений для создания капчи, которые размещают в ней рекламу (например, предлагают собрать паззл из логотипа компании). Это не может не сказаться на градусе настроения пользователя.
Наконец, это очень неудобно для людей с нарушениями координации или проблемами со зрением, и даже для тех, кто не различает цвета, ведь далеко не все внедряющие визуальную капчу владельцы ресурсов добавляют к ней звуковую.
Плюс к этому капча особенно раздражает “возрастную” аудиторию и ту, где есть большой процент людей с низким уровнем компьютерной грамотности или незнанием английского языка.Плохо влияет на конверсию
Как известно, вообще любое лишнее поле для заполнения на сайте ухудшает конверсию. Вот интересное исследование, которое показало, что отказ от капчи приводит к росту конверсии на 3,2%. Точные данные по изменению конверсии в зависимости от капчи каждый ресурс может протестировать самостоятельно, ведь результаты зависят от специфики и аудитории. Но если подходить к проблеме с точки зрения упущенной выгоды, то необходимо посчитать затраты и эффективность в обоих случаях — намного ли выгоднее включать капчу, чем избавляться от спама другими средствами? Тем более, что они есть.
Еще в далеком 2014-м Google стравила между собой свой лучший алгоритм по разгадыванию самых искажённых текстов и людей: компьютер правильно распознал текст в 99,8% случаев, а люди всего в 33%.
Технические
Капчу легко обойтиКапча не выполняет свою основную функцию — не избавляет владельцев ресурсов от ботов. Вариантов “борьбы” спамеров с капчей даже больше, чем один.
Системы распознавания и нейросети
Системы OCR (оптическое распознавание символов) сейчас работают довольно точно и легко распознают как печатный текст, так и изображения. Решение добавлять “шумовой” фон, лишний цвет и линии, искривлять или сдваивать текст не особенно помогает это предотвратить, зато усложняет прохождение для реального человека.
С развитием технологий машинного обучения и нейронных сетей глубокого обучения дальнейший процесс визуального усложнения капч выглядит бесперспективным. Полносверточная нейронная сеть, в которой на входе подается изображение, а на выходе выдается нужное изображение или несколько изображений (карты центров) распознает текстовые капчи в большинстве случаев. Однако для нее же решаема и капча с выбором нужных картинок ибо обнаружение и классификация объектов — ведь это именно то, чем и занимается нейросеть (в том числе та самая нейросеть reCAPCHA от Google). Да и некоторые библиотеки, позволяющие работать с нейронными сетями, тоже разработаны в Google (например, Tensorflow).
Существуют сервисы взлома, при которых берется и транскрибируется аудио-версия капчи. При успешном развитии систем распознавания голоса это тоже перестает быть проблемой для опытных спамеров. Есть алгоритмы и скрипты, такие, например, как алгоритм Кока-Янгера-Касами для распознавания двухмерной грамматики, который может распознать более 50% капч. Есть и другие способы обхода проверки:
- Генераторы чисел и другие системы перебора. Например, если есть один и тот же набор из 10 картинок, которые просто переставляются случайным образом, и нужно на них найти что-то определенное, то есть всего лишь 1024 возможных вариаций
- Восстановление символов по данным логов
- “Подглядывание” в скрипты для вызова капч, к примеру, <img scr=”/captcha.php?code = 1234”/>
- Повторное применение идентификаторов сессий пользователей
- Наконец, спамеры подключают последние версии распознавалок типа FineReader к своим самообучаемым спам-ботам.
Существует целый рынок услуг, предлагающих обойти капчу, и это очень дешево.
Наконец, существуют онлайн-ресурсы с “интересным” содержанием типа игр или контентом для взрослых. Прежде чем пользователи смогут увидеть следующую порцию контента, система сделает бэкэнд запрос к Yahoo или Google, захватит оттуда капчу и подсунет её пользователю. И как только пользователь ответит на вопрос, хакер отправит разгаданную капчу на целевой сайт. Популярный сайт с востребованным контентом сделать несложно, если парсить (или попросту красть) интересный контент с целого ряда “легальных” порталов (мы в своей работе часто сталкиваемся с такими “копипастерами”). А хакер в итоге получает большую аудиторию, которая разгадывает чужие капчи, не подозревая об этом.
Не различает плохих и хороших ботов
Помимо плохих ботов, существуют и хорошие — это роботы поисковых систем и браузеров, полезные корпоративные боты разных сервисов, которые ищут или размещают информацию или предлагают пользователю помощь, автоматизируя работу техсаппорта компании или продажи ее услуг. Например, по данным GlobalDots, на текущий момент человеческий трафик составляет 62.1%, плохие боты 20.4%, а хорошие 17.5% (то есть отставание от плохих не такое уж и критичное). К сожалению, метод капчи не различает плохих и хороших ботов, не пропуская равно всех, хотя “хорошие” боты могли бы быть полезны.
Ресурс для атак
Большинство капч сторонние — предоставленные тем же Google или разработчиками капч-решений. Но во многих случаях их генерированием занимается тот же сервер, на котором расположен сайт, и тогда это становится уязвимым местом для атак.
Генерация некоторых видов капч — это достаточно ресурсоемкая операция и идет она не быстро, так как требует запросов к сторонним библиотекам и в целом работает с изображениями. В случае, если кэширование по дефолту не предусмотрено или по каким-то причинам выключено, это еще больше мороки. Если атакующий ставит задачу создать избыточное количество запросов на генерацию капчи, то сервер может не успевать это делать.
Впрочем, эта проблема решаема:
- Нужно выбрать определенный тип капчи, который этой проблемы лишен
- Расположить капчу на отдельном ресурсе
Замедляет работу сайта
Небольшое замедление может показаться не настолько важной проблемой, но вы будете не правы, если не будете обращать на это внимание. Посмотрите вот на это исследование: в то время как пятая часть маркетологов не считает, что время загрузки влияет на коэффициент конверсии, почти 70% людей признают, что скорость страницы влияет на вероятность покупки.Как капча может влиять на скорость?
- Генерация сложного изображения достаточно ресурсоемкая операция с учетом того, что не все показанные коды используются. Поэтому сервисы капчи и сопутствующие им логи и куки могут замедлять работу онлайн-ресурса.
- Проверка кода и ключа осуществляется бэкендом, где могут возникнуть сложности с передачей больших файлов. Одноразовые ссылки также требуют проверки на уровне бэкенда, создавая лишнюю нагрузку. Капча может зацикливаться и замусоривать backend и тогда требуется создать механизм кеширования неиспользованных изображений для возможности их показа для других пользователей.
- Кроме того, у многих капч-сервисов неудобный API как самого виджета капчи, так и сервера, и с этим разработчику тоже придется помучиться.
Увы, нет. Есть еще несколько моментов.
Во-первых, капчи могут ломать логику работы сайта — особенно в случаях, когда заполнение формы заканчивается капчей, причем не всегда пользователь об этом предупрежден. Однако и вариант “показывать капчу только на входе” не решает задачу защиты от спамеров, ведь получается, что после одноразового прохождения они могут делать дальше все, что захотят.
Во-вторых, давайте подумаем о поисковых системах. Если поисковые системы “обеляются” по user-agent, то капча неэффективна. Если капча показывается всем — то может показаться и поисковикам, и сайт будет иметь проблемы с индексацией.
Не капчей единой
Существует множество других форм защиты, порой даже более эффективной для борьбы с ботами. Например, на фронтенде это могут быть минимальное время заполнения формы, меньше которого может заполнить только бот, или скрытое поле (display:none), которое не увидит человек, но заполнит бот.
На сетевом уровне это могут быть обфускация или шифрование HTML, блокирование определённых user-agent и различные ловушки со стороны веб-сервера: например, создание невидимых разделов сайта, куда попадают только роботы и позже банятся по IP, или фильтрация анонимных прокси.
И, наконец, есть метод, который мы применяем в Variti — это полная фильтрация трафика, который мы считаем единственным полноценным подходом в защите от ботов и DDoS-атак. Мы пропускаем через свои кластеры весь трафик, который идет на сайт или приложение клиентов, а специально настроенные и самообучающиеся алгоритмы определяют и пропускают дальше легитимный трафик от живых пользователей и “хороших” ботов, причем блокировки IP в этом процессе также не требуется. Впрочем, о том, почему мы считаем еще и метод блокировки IP вредоносным, мы поговорим в следующих статьях.
Вход в Личный кабинет
Личный кабинет
Введите данные
Фамилия *
Отчество
Наименование организации (юридического лица)
Email *
Пароль *
Повторите пароль *
Телефон
Регион Не выбранРеспублика КарелияРеспублика КомиАрхангельская областьВологодская областьКалининградская областьЛенинградская областьМурманская областьНовгородская областьПсковская областьг. Санкт-ПетербургНенецкий автономный округРеспублика БашкортостанРеспублика БурятияРеспублика ДагестанРеспублика Марий ЭлРеспублика МордовияРеспублика Саха (Якутия)Республика ТатарстанУдмуртская РеспубликаЧеченская РеспубликаЧувашская РеспубликаАлтайский крайРеспублика АлтайЗабайкальский крайКамчатский крайКраснодарский крайРеспублика АдыгеяКрасноярский крайРеспублика ХакасияРеспублика ТываПермский крайПриморский крайКабардино-Балкарская РеспубликаКарачаево-Черкесская РеспубликаРеспублика ИнгушетияРеспублика Северная Осетия — АланияСтавропольский крайХабаровский крайМагаданская областьЕврейская автономная областьЧукотский автономный округАмурская областьАстраханская областьРеспублика КалмыкияБелгородская областьБрянская областьВладимирская областьВолгоградская областьВоронежская областьИвановская областьИркутская областьКалужская областьКемеровская область — КузбассКировская областьКостромская областьКурская областьЛипецкая областьг. МоскваМосковская областьНижегородская областьНовосибирская областьОмская областьОренбургская областьОрловская областьПензенская областьРостовская областьРязанская областьСамарская областьСаратовская областьСахалинская областьСвердловская областьКурганская областьСмоленская областьТамбовская областьТверская областьТомская областьТульская областьТюменская областьХанты-Мансийский автономный округ – ЮграЯмало-Ненецкий автономный округУльяновская областьЧелябинская областьЯрославская областьРеспублика КрымХерсонская областьЗапорожская областьДонецкая народная республикаЛуганская народная республикаг. Севастополь
Населенный пункт
Почтовый индекс
Корпус/строение
Квартира
Подтверждаю, что я согласен(на) на обработку и хранение моих персональных данных
volume_up
Контрольный код *javascript — Как написать текст в текстовую область с помощью python?
У меня есть код для разгадывания тестовой капчи. Приходит токен решения капчи, далее с кодом открывается дисплей для ввода токена, но как ни пытаюсь не могу ввести токен по коду ниже https://2captcha.com/demo/hcaptcha
по определению Решатель(): драйвер = webdriver.Chrome() driver.get(страница_url) время сна(10) каждый_элемент = driver.find_elements(By.NAME, "h-captcha-response") для элемента в each_element: display_prop = element.value_of_css_property («отображение») если display_prop == 'нет': driver.execute_script("аргументы[0].style.display = 'блок';", элемент) u1 = f"http://rucaptcha.com/in.php?key={API_KEY}&method=hcaptcha&sitekey={data_sitekey}&pageurl={page_url}&json=1&invisible=1" r1 = запросы.get(u1) печать (r1.json()) rid = r1.json(). Получить ("Запрос") u2 = f"https://rucaptcha.com/res.php?key={API_KEY}&sitekey={data_sitekey}&action=get&id={int(rid)}&json=1" время сна(5) пока верно: r2 = запросы.get(u2) печать (r2. json()) если r2.json().get("status") == 1: form_token = r2.json(). Получить ("запрос") перерыв время сна(5) write_token_js = f'document.getElementsByName("h-captcha-response").innerHTML"{form_token}";' время сна(5) submit_js = driver.find_element(By.CSS_SELECTOR, "#root > div > main > div > раздел > form > button._2iYm2u0v9LWjjsuiyfKsv4._1z3RdCK9ek3YQYwshGZNjf._3zBeuZ3zVV-s2YdppESngy._28oc7jlCOdc1KAtktSUZvQ") submit_js.click() driver.execute_script (write_token_js) время сна(10) если __name__ == '__main__': Решатель ()
- javascript
- python
- selenium
- textarea
- captcha
Я исправил это, используя этот код:
write_token = driver.find_element(By.NAME, "h-captcha-response") write_token.send_keys(f"{form_token}")
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя электронную почту и парольОпубликовать как гость
Электронная почтаТребуется, но не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
技术篇:使用gem ‘rucaptcha’实作验证码功能 « Блог xyy601
一.本地实作验证码功能
step1.在G emfile加入gem ‘rucaptcha’和’dalli’
gem 'rucaptcha' драгоценный камень «далли»
运行 bundle install
重启 rails s
step2.新建rucaptcha.rb文件
执行 touch config/initializers/rucaptcha .rb
在其中加入代码:
RuCaptcha.configure do # Цветовой стиль, по умолчанию: :colorful, позволяет: [:colorful, :black_white] # self.style = :красочный # Время истечения пользовательского кода капчи, если вам нужно, по умолчанию: 2 минуты # self.expires_in = 120 # [Требование / 重要] # Сохраняем код Captcha, где этот конфиг больше похож на Rails config.cache_store # по умолчанию: Чтение информации о конфигурации из `Rails.application.config.cache_store` # Но требования RuCaptcha cache_store не в [:null_store, :memory_store, :file_store] # 默认:会从 Rails 配置的 cache_store 里面读取相同的配置信息,用于存储验证码字符 # 但如果是 [:null_store, :memory_store, :file_store] 之类的,你可以通过下面的配置项单独给 RuCaptcha 配置 cache_store self. cache_store = :mem_cache_store конец
step3.执行下列命令
rails g devise:controllers users
rails g devise:views users
补充:
rails g devise:views 生成的文件夹名字默认为devise
rails g devise:views users 生成的
step4.users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController деф создать build_resource (sign_up_params) если verify_rucaptcha?(ресурс) && resource.save дать ресурс, если block_given? если ресурс.сохранился? если resource.active_for_authentication? set_flash_message! :уведомление, :signed_up sign_up (имя_ресурса, ресурс) ресурс response_with, расположение: after_sign_up_path_for(ресурс) еще set_flash_message! :уведомление, :"signed_up_but_#{resource.inactive_message}" expire_data_after_sign_in! ресурс response_with, расположение: after_inactive_sign_up_path_for(ресурс) конец еще ресурс clean_up_passwords set_minimum_password_length ресурс response_with конец еще ресурс clean_up_passwords ресурс response_with конец конец конец
step6. 修改users/registrations/new.html.erb
加入代码:
<%= f.input :email, обязательно: true, автофокус: true %> <%= f.input :password, required: true, hint: ("#{@minimum_password_length} минимум символов", если @minimum_password_length) %> <%= f.input :password_confirmation, требуется: true %> + <%= rucaptcha_image_tag(alt: 'Captcha') %> + <%= rucaptcha_input_tag(класс: 'form-control', заполнитель: '请输入验证码') %>
step7.同样的方式实作password和вход в систему
(1)为password页面添加验证码
класс PasswordsController < Devise::PasswordsController деф создать self.resource = resource_class.find_or_initialize_with_errors(Devise.reset_password_keys, resource_params, :not_found) если self.resource.persisted? && verify_rucaptcha?(ресурс) self.resource.send_reset_password_instructions конец дать ресурс, если block_given? если успешно_отправлено?(ресурс) response_with({}, расположение: after_sending_reset_password_instructions_path_for(resource_name)) еще response_with (ресурс) конец конец конецпользователи/пароли/new. html.erb
+ <%= rucaptcha_image_tag(alt: 'Captcha') %> + <%= rucaptcha_input_tag(класс: 'form-control', заполнитель: '请输入验证码') %>
(2)Войти в систему 页面添加验证码
app/controller/sessions_controller.rbкласс SessionsController < Devise::SessionsController prepend_before_action :valify_captcha!, только: [:create] деф валифи_капча! разве verify_rucaptcha? redirect_to new_user_session_path, предупреждение: t('rucaptcha.invalid') возвращаться конец истинный конец конецпользователи/сеансы/new.html.erb
+ <%= rucaptcha_image_tag(alt: 'Captcha') %> + <%= rucaptcha_input_tag(класс: 'form-control', заполнитель: '请输入验证码') %>
step7.修改routes文件
Rails.application.routes.draw сделать ... смонтировать RuCaptcha::Engine => "/rucaptcha" - devise_for: пользователи + devise_for: пользователь, контроллеры: { + пароли: 'пользователи/пароли', + регистрации: 'пользователи/регистрации', + сеансы: 'пользователи/сеансы' + } . .. конец
此时,如果在相应的页面输入验证码,会发生报错:
step8.安装memcached
在终端输入
brew install memcached
brew services start memcached
重启рельсы s
这样就可以在本地进行验证码使用了。
二.将验证码功能推到heroku上
按照上述方法在本地实作好验证码功能后,如果要上传到heroku,进行如下步骤: 90 051 (1)新建分支
git checkout -b rucaptcha-heroku
(2)在heroku上启用memcachier这个服务
选择element
点击просмотреть все дополнения
选择memcachier
点击安装
900 51 选择需要安装该服务的app
点击provision会提示绑定 кредитная карта
点击Настройки аккаунта选择添加биллинг,添加信用卡
(3)启动服务后,执行 heroku addons:create memcachier: dev
(4)移除原来的rucaptcha.rb
mv config/initializers/rucaptcha .rb config/initializers/rucaptcha.rb.temp
(5)修改config/environments/production.rb
Rails.application.configure do + config.cache_store = :dalli_store, + (ENV["MEMCACHIER_SERVERS"] || "").split(","), + {:username => ENV["MEMCACHIER_USERNAME"], + :password => ENV["MEMCACHIER_PASSWORD"], + :failover => правда, + :socket_timeout => 1,5, + :socket_failure_delay => 0,2, + :down_retry_delay => 60 + } конец
(6) 保存修改,上传到heroku
git add .