Ruby on Rails中验证码的建议

26
我想在一个Rails项目中实现验证码来进行表单提交,但我不确定应该选择什么。我倾向于实现简单和使用时可靠性,而不是过于复杂,因为我的应用程序不需要太高的安全级别。
有人有任何建议吗?

1
如果你正在寻找一种负面(或蜜罐)验证码,我之前写了这个宝石invisible_captcha - markets
如果你正在寻找一个经典的基于图像的验证码,你可以查看我目前正在积极开发的captcher gem。 - zinovyev
7个回答

19

在Rails应用中添加验证码最简单的方法是使用Ambethia reCAPTCHA

1. 安装:

config.gem "ambethia-recaptcha", :lib => "recaptcha/rails", 
      :source => "http://gems.github.com"

如果你喜欢的话,你也可以将它安装为一个插件。

2. 获取一个 reCAPTCHA 账号:

你需要创建一个reCAPTCHA密钥。你可以在 reCAPTCHA 网站 上这样做。

3. 使用方法:

使用recaptcha_tags来输出必要的HTML代码,然后使用verify_recaptcha验证输入。

4. 更多阅读:


5
有趣的宝石,如果他们的文档不那么差就好了。他们没有任何示例将其实现到他们的表单中。唉。 - imjp
“reCAPTCHA网站”和“reCAPTCHA文档”链接显示404错误。 - Jagdeep Singh

5

安装

将以下内容添加到你的 GEMFILE 中:

gem "galetahub-simple_captcha", :require => "simple_captcha"

或者

gem 'galetahub-simple_captcha', :require => 'simple_captcha',
    :git => 'git://github.com/galetahub/simple-captcha.git'

如果您使用Bundler(或者使用适用于Rails配置的包管理器),则运行bundle install

设置

安装后,请按照以下简单步骤设置插件。设置将取决于应用程序使用的Rails版本。

rails generate simple_captcha
rake db:migrate

使用方法

基于控制器

在文件“app/controllers/application.rb”中添加以下行:

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

在表单标签内的视图文件中添加以下代码。
<%= show_simple_captcha %>

在控制器的动作中进行身份验证

if simple_captcha_valid?
  do this
else
  do that
end

基于模型

在表单标签内的视图文件中添加以下代码

<%= show_simple_captcha(:object=>"user") %>

在模型类中添加以下代码:
class User < ActiveRecord::Base
  apply_simple_captcha
end

表单构建器辅助程序

<%= form_for @user do |form| -%>
  ...
  <%= form.simple_captcha :label => "Enter numbers.." %>
  ...
<% end -%>

使用验证码进行验证

注意:@user.valid? 仍然可以正常工作,但它不会验证验证码。

@user.valid_with_captcha?

使用验证码进行保存

注意: @user.save仍然可以正常工作,它不会验证验证码。

@user.save_with_captcha

Formtastic集成

SimpleCaptcha检测到您使用Formtastic并追加

“SimpleCaptcha::CustomFormBuilder”.

<%= form.input :captcha, :as => :simple_captcha %>

选项和示例

查看选项

*label* - provides the custom text b/w the image and the text field, the default is “type the code from the image”

*object* - the name of the object of the model class, to implement the model based captcha.

*code_type* - return numeric only if set tonumeric

全局选项

image_style - provides the specific image style for the captcha image.

这个插件提供了八种不同的样式:

  1. simply_blue(简洁蓝)
  2. simply_red(简洁红)
  3. simply_green(简洁绿)
  4. charcoal_grey(木炭灰)
  5. embosed_silver(浮雕银)
  6. all_black(全黑)
  7. distorted_black(扭曲黑)
  8. almost_invisible(几乎透明)

默认样式是“简洁蓝”。你也可以指定“随机”来选择随机图像样式。

distortion - handles the complexity of the image. The :distortion can be set to ‘low’, ‘medium’ or ‘high’. Default is ‘low’.

*创建“rails_root/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'
end

你可以添加自己的样式:
SimpleCaptcha.setup do |sc|
  sc.image_style = 'mycaptha'
  sc.add_image_style('mycaptha', [
      "-background '#F4F7F8'",
      "-fill '#86818B'",
      "-border 1",
      "-bordercolor '#E0E2E3'"])
end

您可以提供ImageMagick所安装的路径:
SimpleCaptcha.setup do |sc|
  sc.image_magick_path = '/usr/bin' # you can check this from console by running: which convert
end

您可以提供存储临时文件的路径。当您无法访问默认目录 /tmp 时,这将非常有用。

SimpleCaptcha.setup do |sc|
  sc.tmp_path = '/tmp' # or somewhere in project eg. Rails.root.join('tmp/simple_captcha').to_s, make shure directory exists
end

如何更改SimpleCaptcha DOM元素的CSS?

您可以根据需要在此文件中更改SimpleCaptcha DOM元素的CSS。

*/app/views/simple_captcha/_simple_captcha.erb*

视图示例

基于控制器的示例

<%= show_simple_captcha %>

<%= show_simple_captcha(:label => "human authentication") %>

基于模型的示例

<%= show_simple_captcha(:object => 'user', :label => "human authentication") %>

模型选项

message - provides the custom message on failure of captcha authentication the default is “Secret Code did not match with the Image”

add_to_base - if set to true, appends the error message to the base.

模型示例

class User < ActiveRecord::Base
  apply_simple_captcha
end

class User < ActiveRecord::Base
  apply_simple_captcha :message => "The secret Image and code were different", :add_to_base => true
end

这个 gem 无法工作。它会出现错误 "Could not find gem 'galetahub-simple_captcha' in git://github.com/galetahub/simple-captcha.git (at master@2602bf1)。 源代码中没有包含任何版本的 'galetahub-simple_captcha'。 - BalajiB

3

好的,ReCaptcha可以胜任这项工作,网上有许多相关教程。

然而,在您的控制器中编写正确的“def create”(创建方法),以便同时传递表单中的任何内容并验证Recaptcha。然后它将很好地工作。

使用ReCaptcha插入表单后,出现了一个小问题,表单验证停止工作了。但是,可以通过在模型文件中插入简单的代码来解决这个问题:

after_validation :on => :create 

(:create = 是您控制器中的 "def create" 方法。它将强制表单先进行验证,然后再验证 Recaptcha。


0

0

我在Rails应用程序中使用了Ambethia Recapchat。相比其他工具,它更加简单易用。


0

对于功能而言,reCAPTCHA对于Rails来说非常棒。然而,如果您需要XHTML验证,请远离它!这个插件不会(也许永远不会)进行验证。我发现令人尴尬的是,我的整个网站中只有一个页面无法通过验证 - 那就是带有reCAPTCHA的页面。如果还有其他选择,我一定会选择其他的。


0
如果你想要一个验证有效且(几乎)和reCAPTCHA一样容易使用的CAPTCHA,请尝试我的SlideCAPTCHA。(我几天前写的,需要在实际使用中进行一些测试。)我基于reCAPTCHA插件开发了它的部署过程,但你可以用CSS来自定义它的样式。
但是,它确实需要Ruby/GD的支持,所以如果你没有安装GD,我不能保证GD的安装和使用会很容易!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接