areyouahuman на rails 3. альтернатива обычной капче
Современная капча под давлением программистов роботов-распознователей капчи мутировала уже во что-то непонятное, гугловскую капчу, я например, обновляю раз по 5 перед тем как смогу прочитать что там написано. Короче время привычной капчи заканчивается. Наступает время альтернативной. Например, есть такая штука как AreYouAHuman. Ниже будет показано как ее интегрировать в Rails 3 на примере Devise.
установка
Для Ruby есть типо инструкция на офсайте, но я опишу немного по своему.
Как обычно добавляем в Gemfile:
gem 'ayah_integration' |
и бандлим:
bundle install |
Теперь надо зарегистрироваться на сайте для получения ключей.
интеграция в модель плагина Devise
Предполагается, что уже есть сгенерированная и настроенная модель Devise. У меня модель называется User, а внедрять капчу я буду в форму восстановления пароля.
интеграция в представление
Если вы особо не мучали Devise генерирований различных представлений, то по умолчанию форма восстановления пароля лежит тут: app/views/devise/passwords/new.html.erb
. Ее надо открыть и привести к виду:
1 2 3 4 5 6 7 8 9 10 11 12 | ... <%ayah=AYAH::Integration.new(<publisher_key>,<scoring_key>)%> ... <%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post }) do |f| %> ... <%=ayah.get_publisher_html.html_safe%> ... <%end%> ... |
У AYAH есть 2 вида капчи:
- Lightbox – выводиться в модальном окне после нажатия кнопки ‘отправить’ (как в комментариях в этом блоге)
- Embedded – сразу видна в форме
Так вот в зависимости от того, какой вид отображения AYAH вы выбрали в настройках, капча в форме восстановления пароля будет либо видна после события submit
, либо сразу.
интеграция в контроллер
Чтобы соорудить свою обработку события ‘восстановление пароля’ в Devise нужно сделать свой контроллер.
В директории app/controllers
нужно сделать файл passwords_controller.rb
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class PasswordsController < Devise::PasswordsController def create session_secret = params['session_secret'] ayah = AYAH::Integration.new(<publisher_key>,<scoring_key>) ayah_passed = ayah.score_result(session_secret, request.remote_ip) if ayah_passed super else respond_to do |format| format.html { redirect_to new_user_password_path, notice: 'Invalid CAPTCHA' } end end end end |
Я тут не слишком заморачивался и вывел ошибку капчи в notice
, хотя по нормальному ее, конечно, надо было бы добавить к ошибкам модели devise.
добавление контроллера в routes.rb
Последним шагом надо обозначить в config/routes.rb
, что для passwords имеется специальный контроллер:
1 2 3 | ... devise_for :users, :controllers => { :passwords => "passwords" } ... |
Надо не забывать, что после изменения routes.rb
надо перезапустить WEBrick.
Итого
Многие говорят, что такую капчу роботу легче взломать, чем обычную, т.к. тут ограниченный набор картинок. Это мнение во многом справедливо, однако, современная невзламываемая капча количеством и сложностью своих манипуляций с текстом стремительно мчиться к маразму, экстенсивное развитие уже не приносит ожидаемого результата. Чем сложнее будут эффекты преобразований, тем меньше будет преймущество человека перед роботом в разгадывании этих иероглифов.
Капчи подобные AYAH имеют временнУю фору – пока они станут настолько популярными, чтобы ими заинтересовались хакеры, они уже достаточно смогут пополнить базу своих картинок, игр и т.д., а быть может и эволюционировать до алгоритмов автоматической генерации игр/картинок, я имею ввиду генерации сколько угодно большого количества разных, например, ламп или бутербродов (различия не по цвету, а по форме и содержанию).
Разработчик AYAH обещал в скором времени добавить многоязычность интерфейса, так что скоро возможно существенное расширение поля применения.