`

Rails 验证码解决方案和其他

阅读更多
手头有个需要,是关于做防爬虫表单提交的验证码问题,

于是,搜集了相关的资料,发现老的资料比较多。基本都是07年
比如:http://babo.iteye.com/blog/72298
大部分的验证的办法,都是用Rmagick生成,这普通会有两个问题
1. Rmagick的内存问题
2. 每次验证都要生成

那么,现在的流行验证码解决方案怎么样了呢
于是,把自己东拼西凑的东西罗列一下:

方案1. 首选的解决方案是把这个服务交给云服务提供商,这是流行趋势。如同,我们把反馈交给invoice。  recaptcha就专业提高验证码,第一流行的验证码插件就是利用recaptcha的。
这样优势会很明显使用起来非常简单,而且专业的提供商,效果也不错

大致使用如下:

 script/plugin install git://github.com/ambethia/recaptcha.git



设置API Keys


  recaptcha_tags :public_key => '6Lc6BAAAAAAAAChqRbQZcn_yyyyyyyyyyyyyyyyy'

  verify_recaptcha :private_key => '6Lc6BAAAAAAAAKN3DRm6VA_xxxxxxxxxxxxxxxxx'


也可以在environment.rb设置
  ENV['RECAPTCHA_PUBLIC_KEY']  = '6Lc6BAAAAAAAAChqRbQZcn_yyyyyyyyyyyyyyyyy'
  ENV['RECAPTCHA_PRIVATE_KEY'] = '6Lc6BAAAAAAAAKN3DRm6VA_xxxxxxxxxxxxxxxxx'


View上加tag
recaptcha_tags
支持如下参数
引用
:ssl: Uses secure http for captcha widget (default false)
:noscript: Include <noscript> content (default true)
:display: Takes a hash containing the theme and tabindex options per the API. (default nil)
:ajax: Render the dynamic AJAX captcha per the API. (default false)
:public_key: Your public API key, takes precedence over the ENV variable (default nil)
:error: Override the error code returned from the reCAPTCHA API (default nil)



controller中验证如下:

  respond_to do |format|
    if verify_recaptcha(:model => @post, :message => "Oh! It's error with reCAPTCHA!") && @post.save
      # ...
    else
      # ...
    end
  end



方案2: 先随机生成需要的验证码图片,用的时候直接验证
这样就解决了Rmagick的内存问题,而且,用户验证很快不用当时再生成图片。

使用如下:
依照如下安装Rmagick
http://rmagick.rubyforge.org/install-faq.html
ubuntu如下:
引用

在linux下生成图片需要图片处理软件ImageMagick的Ruby语言RMagick库支持。安装RMagick最麻烦,我查了N多资料试了N次才安装成功。
   1. 安装ImageMagick:sudo apt-get install imagemagick
   2. 查看安装结果:dpkg -l | grep magick
   3. 更新软件包列表:sudo apt-get update
   4. 安装图片处理软件包libmagick9-dev:sudo apt-get install libmagick9-dev ruby1.8-dev
   5. 安装接口软件包RMagick:sudo gem install rmagick
   6. 说明:如果出现问题或者错误请执行下面命令:sudo apt-get remove --purge libmagick9-dev

在irb里require 'RMagick'。如果返回true,表示安装成功。


安装插件

script/plugin install git@github.com:zendesk/captcha.git


修改environment.rb

#environment.rb

   CAPTCHA_SALT = 'Something really random here'



生成图片:
项目根目录,命令行执行
rake captcha:generate COUNT=250

可以带如下参数:

引用
COUNT          - the number of images to generate, default 3
IMAGE_HEIGHT   - the height of the captcha image in pixels, default 50
IMAGE_WIDTH    - the width of the captcha image in pixels, default 260
CAPTCHA_LENGTH - the number of characters in the captcha, default 5
FILE_FORMAT    - the file type of the captcha image (png or gif)



View显示:
验证码显示
  <%= captcha_block %>


如果想更改验证码显示的样式可以参照captcha_helper.rb

Controller中验证如下:
PostController < ApplicationController

   validates_captcha

   def create
      ...
      if captcha_validated?
         ...
      else
         ...
      end
   end
end


其中的生成图片完全可以使用minimagick

方案3. 不使用图片生成的验证方式

    script/plugin install http://code.subwindow.com/negative_captcha

 
Controller中添加回调
   
before_filter :setup_negative_captcha, :only => [:new, :create]

 
对应的执行方法如下:
 
    private
      def setup_negative_captcha
        @captcha = NegativeCaptcha.new(
          :secret => NEGATIVE_CAPTCHA_SECRET, #A secret key entered in environment.rb.  'rake secret' will give you a good one.
          :spinner => request.remote_ip, 
          :fields => [:name, :email, :body], #Whatever fields are in your form 
          :params => params)
      end


验证逻辑部分
 
    def create
      @comment = Comment.new(@captcha.values) #Decrypted params
      if @captcha.valid? && @comment.save
        redirect_to @comment
      else
        flash[:notice] = @captcha.error if @captcha.error 
        render :action => 'new'
      end
    end
 

View显示和表单如下:
 
    <% form_tag comments_path do -%>
      <%= negative_captcha(@captcha) %>
        <ul class="contact_us">
          <li>
            <label>Name:</label>
            <%= negative_text_field_tag @captcha, :name %>
          </li>
          <li>
            <label>Email:</label>
            <%= negative_text_field_tag @captcha, :email %>
          </li>
          <li>
            <label>Your Comment:</label>
            <%= negative_text_area_tag @captcha, :body %>
          </li>
          <li>
            <%= submit_tag %>
          </li>
        </ul>
      <% end -%>



最后,单独就验证码的样式而言,完全可以使用minimagick或者,按照如下,改的更漂亮
require 'rubygems'
require 'RMagick'
class ProofImage
  include Magick
  attr_reader :text, :image
  Jiggle = 15
  Wobble = 15

  def initialize(len=4)
    chars = ('a'..'z').to_a # + ('0'..'9').to_a
    text_array=[]
    1.upto(len) {text_array << chars[rand(chars.length)]}
    #background_type = "granite:" #花岗岩
    #background_type = "netscape:" #彩条
    #background_type = "xc:#EDF7E7" #指定背景色,例:xc:red
    #background_type = "null:" #纯黑
    granite = Magick::ImageList.new('null:')
    canvas = Magick::ImageList.new
    canvas.new_image(32*len, 50, Magick::TextureFill.new(granite))
    gc = Magick::Draw.new
    gc.font_family = 'times'
    gc.pointsize = 40
    cur = 10

    text_array.each{|c|
      rand(10) > 5 ? rot=rand(Wobble):rot= -rand(Wobble)
      rand(10) > 5 ? weight = NormalWeight : weight = BoldWeight
      gc.annotate(canvas,0,0,cur,30+rand(Jiggle),c){
        self.rotation=rot
        self.font_weight = weight
        self.fill = 'green'
      }
      cur += 30
    }
    @text = text_array.to_s
    @image = canvas.to_blob{
      self.format="GIF"
    }

    #生成图片文件
    #text.text(0, 0, " ")
    #text.draw(canvas)
    #canvas.write('test.gif') #图片位于项目根目录下。也可以使用linux中的绝对路径如:/home/chengang/test.gif

  end
end

7
0
分享到:
评论
5 楼 fireDragonpzy 2012-03-01  
uninitialized constant ApplicationHelper::ReCaptcha
4 楼 wohaizai007 2011-03-24  
第一种方案
View上加tag
recaptcha_tags
怎么写啊?
3 楼 luoping0425 2010-12-30  
用了关于rmagick的一段,参考一下,有关系么?
http://luoping0425.iteye.com/admin/blogs/855641
2 楼 fireflyman 2010-08-30  
Hooopo 写道
貌似minimagic不能生成图片…

詐尸
1 楼 Hooopo 2010-08-30  
貌似minimagic不能生成图片…

相关推荐

    Go-Packagecaptcha为Macaron提供验证码服务

    总的来说,`Package captcha`是Macaron框架的一个强大补充,它为开发者提供了简单易用的验证码解决方案,使得Web应用的安全性得到了保障,同时减少了开发过程中的复杂性。通过深入学习和实践,你可以更好地利用这个...

    rails登陆注册

    在Ruby on Rails框架中,构建用户登录和注册功能是Web应用程序开发中的常见任务。...此外,还可以使用Devise这样的成熟认证解决方案,它提供了更多的功能和灵活性,但基础理解是实现这些功能的关键。

    invisible_captcha:对Rails应用程序的干扰和灵活的垃圾邮件保护

    针对Rails应用的简单灵活的垃圾邮件防护解决方案。 Invisible Captcha提供了多种技术来保护您的应用程序免受垃圾邮件攻击。 主要保护是基于honeypot原理的解决方案,该解决方案提供了更好的用户体验,因为对于...

    rails-security-audit:Rails安全审核清单

    带有Warden的Rails的灵活身份验证解决方案。 一种用于设计的企业安全性扩展,试图满足Web应用程序的工业标准安全性需求。 -Ruby on Rails的授权Gem。 通过OO设计和纯Ruby类进行的最小授权 一个插件,可以使在...

    actions_as_textcaptcha:Rails的基于文本的逻辑问题验证码

    ActsAsTextcaptcha通过基于文本的逻辑问题验证码为Rails模型提供垃圾邮件保护。 问题来自 。 它们很容易被人类解决,但机器人很难破解。 您还可以根据自己的问题配置gem。 作为替代方案,也可以作为处理任何API...

    invisible_captcha, 针对RoR应用的Unobtrusive和灵活的垃圾邮件保护.zip

    invisible_captcha, 针对RoR应用的Unobtrusive和灵活的垃圾邮件保护 不可见的验证码 Rails 应用程序的简单和灵活的垃圾邮件保护解决方案。不可见的Captcha提供了不同的技术来保护你的应用程序免受垃圾干扰。主保护是...

    ror-codelit-landing:基于 ruby​​ on rails 的登陆页面

    在实际操作中,开发者可能还使用了 Bootstrap 或其他 CSS 框架来快速构建响应式布局,以及 Devise 或其他认证解决方案来处理用户注册、登录和授权。通过分析项目源码,我们可以深入理解 Ruby on Rails 如何与 ...

    Web开发技术(课件).zip

    这些框架提供了一套完整的解决方案,包括组件化开发、状态管理、路由等,使得大型Web应用的构建更加高效。 6. 后端开发:后端技术涉及服务器端编程,处理业务逻辑、数据存储和交互。常见的后端框架有Node.js(使用...

    蓝色大气的公司后台登录页面 是一款某建站公司的后台登录页面html模板下载 。.zip

    总的来说,“蓝色大气的公司后台登录页面”HTML模板是前端开发的一个实用工具,它为建站公司提供了快速构建专业后台登录界面的解决方案,减少了从零开始设计的时间成本,同时保证了界面的高质量和用户体验。...

    sms_confirmable:设计通过短信验证电话号码的模块

    Devise是一个灵活的身份认证解决方案,适用于Ruby on Rails应用。它为开发者提供了许多内置功能,如密码重置、电子邮件验证和会话管理等。"sms_confirmable"模块则是对Devise的一个扩展,增加了短信验证功能,让用户...

    个人社区模板

    "个人社区模板"是一个专为创建互动性强、用户参与度高的在线社区而设计的软件解决方案。这个模板提供了发布问题、解答问题以及各种社区互动功能,旨在帮助用户建立一个集知识分享、互助交流于一体的网络平台。下面...

    [博客空间]Nbs博客系统 v1.0_nbs.zip

    总的来说,Nbs博客系统 v1.0是一个全面的博客解决方案,它涵盖了博客系统开发中的许多关键要素,旨在为用户提供一个功能强大、易用且可定制的在线写作和交流平台。通过深入学习和利用这些功能,用户可以创建出专业且...

    第三波书店

    8. **云计算**:为了降低成本和扩展性,"第三波书店"可能会选择在云端部署,如Amazon AWS、Microsoft Azure或阿里云等平台,利用云服务提供的弹性计算、存储和数据库解决方案。 9. **性能优化**:随着业务增长,...

    SpringOne-Using Spring Security 2

    通过以上内容可以看出,Spring Security 2提供了一套全面而强大的安全解决方案,旨在帮助开发者轻松地为Java应用程序实施各种安全措施。无论是Web应用还是非Web应用,Spring Security都能提供相应的支持,确保应用...

    awesome-web-scraping:用于网络抓取和数据处理的库,工具和API的列表

    它包括了解析HTML、处理JavaScript、模拟浏览器行为、代理服务器、验证码解决方案以及数据清洗等多个方面的工具。这些工具可以帮助开发者绕过反爬策略,实现自动化数据抓取,并对抓取到的数据进行有效处理和分析。 ...

    hotauth-开源

    总之,hotauth通过hotwire技术和Perl脚本hotauth.pl,为开发者提供了一个强大且灵活的身份验证解决方案。它不仅关注用户体验,更注重安全性,是开源软件社区的一个宝贵贡献。对于那些寻求高效身份验证机制的开发者来...

    在博客中屏蔽垃圾留言的简单方法

    在维护个人博客或者小型网站时,垃圾留言(Spam)是一个常见的问题,它们会污染网站内容,影响用户体验。...对于那些没有现成插件可用或希望自定义解决方案的开发者来说,这是一个值得尝试的方法。

    spree_3d_secure:Spree Commerce的3D安全示例实现

    Spree Commerce是一个开源的电子商务平台,它为在线商家提供了一个灵活且可扩展的解决方案来创建和管理他们的在线商店。在电子商务领域,3D Secure是一种重要的安全机制,旨在增强信用卡在线交易的安全性。3D Secure...

    java开源包1

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包11

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

Global site tag (gtag.js) - Google Analytics