+1

Xác thực người dùng bằng Captcha sử dụng gem simple-captcha2

Tài liệu tham khảo: https://github.com/pludoni/simple-captcha

I, Giới thiệu

Một CAPTCHA là một loại kiểm thử dạng hỏi đáp được dùng trong máy tính để xác định xem người dùng có phải là con người hay không. Captcha là chữ viết tắt của "Completely Automated Public Turing test to tell Computers and Humans Apart". Đây là một quá trình một máy tính (máy chủ) yêu cầu một người dùng hoàn tất một kiểm tra đơn giản mà máy tính có thể dễ dàng tạo ra và đánh giá, nhưng không thể tự giải nó được. Vì máy tính không thể giải quyết CAPTCHA, bất kỳ người dùng nào nhập vào lời giải đúng sẽ được xem là con người.

SimpleCaptcha2 là một plugin captcha mạnh và đơn giản nhất. Nó yêu cầu thêm một dòng mới trong views và controllers/models. SimpleCaptcha2 được sử dụng trong Rails 3 và 4.

II, Tính năng

  • Sử dụng 0 file hệ thống (mã số bí mật đã được di chuyển đến db-store và image-store đã bị xóa)
  • Cung cấp đa dạng các style ảnh
  • Cung cấp 3 mức độ phức tạp cho các ảnh
  • Làm việc tốt trong môi trường phân tán
  • Xử lý DOM và CSS linh hoạt
  • Tự động loại bỏ dữ liệu captcha chưa được match sau 1h

III, Yêu cầu:

    brew install ghostscript

IV, Cài đặt và sử dụng

1, Khởi tạo

Tạo một project mới tên captcha:

    rails new captcha

Tạo Users

    rails g scaffold Users name:string email:string password:string

Thêm trong routes:

    root 'users#index'

2, Cài đặt captcha

Trong Gemfile thêm:

    gem 'simple_captcha2', require: 'simple_captcha'

Rùi

    bundle install

Trong console nhập:

    rails generate simple_captcha

Project sẽ sinh ra 2 file: db/migrate/20150831153445_create_simple_captcha_data.rb và app/views/simple_captcha/_simple_captcha.erb.

Sau đó:

    rake db:migrate

Có 2 cách để sử dụng captcha là bằng controller hoặc bằng model

a, Dùng controller based

Thêm dòng sau vào "app/controllers/application.rb"

    ApplicationController < ActionController::Base
      include SimpleCaptcha::ControllerHelpers
    end

Trong file view app/views/users/_form.html.erb thêm:

         <%= f.label :password %><br>
     <%= f.text_field :password %>
     </div>
    +  <%= show_simple_captcha %>
     <div class="actions">
       <%= f.submit %>
     </div>

Trong file app/controllers/application_controller.rb thêm:

     class ApplicationController < ActionController::Base
    +  include SimpleCaptcha::ControllerHelpers
     # Prevent CSRF attacks by raising an exception.
     # For APIs, you may want to use :null_session instead.
       protect_from_forgery with: :exception

Config lại controller. Trong app/controllers/users_controller.rb

         @user = User.new(user_params)

         respond_to do |format|
    -      if @user.save
    +      if simple_captcha_valid? && @user.save
             format.html { redirect_to @user, notice: 'User was successfully created.' }
             format.json { render :show, status: :created, location: @user }
           else

b, Dùng model based

Trong app/controllers/users_controller.rb

         @user = User.new(user_params)

         respond_to do |format|
    -      if simple_captcha_valid? && @user.save
    +      if @user.valid_with_captcha? && @user.save
             format.html { redirect_to @user, notice: 'User was successfully created.' }
             format.json { render :show, status: :created, location: @user }
           else

         # Never trust parameters from the scary internet, only allow the white list through.
         def user_params
    -      params.require(:user).permit(:name, :email, :password)
    +      params.require(:user).permit(:name, :email, :password, :captcha, :captcha_key)
         end
       end

Trong app/models/user.rb thêm:

     class User < ActiveRecord::Base
    +  apply_simple_captcha
     end

Trong view app/views/users/_form.html.erb:

         <%= f.label :password %><br>
         <%= f.text_field :password %>
       </div>
    -  <%= show_simple_captcha %>
    +  <%= f.simple_captcha :label => "Enter numbers.." %>
       <div class="actions">
         <%= f.submit %>
       </div>

Thêm I18n trong config/locales/en.yml:

    en:
      hello: "Hello world"
      simple_captcha:
        placeholder: "Enter the image value"
        label: "Enter the code in the box:"
        refresh_button_text: "Refresh"
        message:
          default: "Secret Code did not match with the Image"
          user: "The secret Image and code were different"

3, Options

a, View options

  • label: để custom text cho ảnh và text field. Default là "type the code from the image"
  • object: tên của đối tượng trong lớp model, thực thi model based captcha
  • code_type: trả về giá trị số nếu set kiểu số
  • multiple: cho phép sử dụng những captcha giống nhau cho nhiều forms trong một page

b, global options

  • image_style: cung cấp style ảnh đặc biệt cho captcha image. Có 8 styles khác nhau
  1. simple_blue
  2. simple_red
  3. simple_green
  4. charcoal_grey
  5. embosed_silver
  6. all_black
  7. distorted_black
  8. almost_invisible

Style mặc định là simple_blue. Bạn có thể chọn random một style ảnh

  • :distortion - xử lí độ phức tạp của ảnh với các giá trị: low, medium, high. Mặc định là low
  • :implode - xử lí độ phức tạp cho ảnh. Với các giá trị: none, low, medium, high. Mặc định là medium

Tạo "./config/initializers/simple_captcha.rb":

    SimpleCaptcha.setup do |sc|
      # default: 100x28
      sc.image_size = '120x40'

      # default: 5
      sc.length = 6

      # default: simply_blue
      # possible values:
      # 'embosed_silver',
      # 'simply_red',
      # 'simply_green',
      # 'simply_blue',
      # 'distorted_black',
      # 'all_black',
      # 'charcoal_grey',
      # 'almost_invisible'
      # 'random'
      sc.image_style = 'simply_green'

      # default: low
      # possible values: 'low', 'medium', 'high', 'random'
      sc.distortion = 'medium'

      # default: medium
      # possible values: 'none', 'low', 'medium', 'high'
      sc.implode = 'low'
    end

Hoặc bạn cũng có thể thêm một style riêng:

    SimpleCaptcha.setup do |sc|
      sc.image_style = 'mycaptha'
      sc.add_image_style('mycaptha', [
      "-background '#F4F7F8'",
      "-fill '#86818B'",
      "-border 1",
      "-bordercolor '#E0E2E3'"])
    end

Bạn có thể cung cấp đường dẫn của image_magick:

    SimpleCaptcha.setup do |sc|
      sc.image_magick_path = '/usr/bin'
    end

Bạn có thể thay đổi CSS cho các phần tử SimpleCaptcha DOM trong file:

    app/views/simple_captcha/_simple_captcha.erb

V, Lời kết:

CAPTCHA được dùng để ngăn chặn phần mềm tự động thực hiện những tác vụ có thể làm giảm đi chất lượng dịch vụ của một hệ thống có sẵn, có thể bằng cách lạm dụng hoặc làm hao tổn tài nguyên. CAPTCHA có thể được dùng để bảo vệ hệ thống chống lại spam e-mail, như các dịch vụ webmail của Gmail, Hotmail, và Yahoo!. CAPTCHA cũng được dùng nhiều trong việc ngăn chặn đăng bài tự động trong blog hoặc diễn đàn, có thể với mục đích quảng cáo thương mại, hoặc quấy rối và phá hoại. CAPTCHA cũng có chức năng quan trọng trong hạn chế quá tải, vì việc sử dụng tự động một dịch vụ là điều mong muốn cho đến khi cách dùng đó bắt đầu vượt quá giới hạn, và làm tổn hại đến những người dùng là con người.

Demo: https://floating-springs-6553.herokuapp.com/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí