Xác thực người dùng bằng Captcha sử dụng gem simple-captcha2
Bài đăng này đã không được cập nhật trong 9 năm
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:
- Ruby >= 1.9.3
- Rails >= 3.2
- Installed ImageMagick: http://www.imagemagick.org/script/index.php
- Install Ghostscript nếu đang trên Mac-system:
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
- simple_blue
- simple_red
- simple_green
- charcoal_grey
- embosed_silver
- all_black
- distorted_black
- 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.
All rights reserved