`
SanyKing
  • 浏览: 4194 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

在ruby on rails中实现验证码

阅读更多

在windows环境下,旧版本的Rmagick安装完gem后,需要运行一个postinstall.rb来设置windows字体等。新版本的Rmagick没有这个步骤,代替是安装ImageMagick。我按照README安装成功后,在rails中使用还是出现无法读取字体的错误,忍无可忍又换了旧版本的Rmagick,没想到跟ruby的解释器版本不一致,render templage的时候出现parse error类型的错误。认真比对了下新老版本的差别,原来旧版本的Rmagick在Config目录下多了个type-windows.xml来设置windows字体,在此记录下正确的安装方法:

1.到http://rubyforge.org/frs/?group_id=12&release_id=8170,下载RMagick-1.14.1_IM-6.3.0-7-Q8.zip

2.解压后在目录执行gem install rmagick-1.14.1-win32.gem

3.最后,双击ImageMagick-6.3.0-7-Q8-windows-dll.exe安装ImageMagick

4.将ImageMagick的安装目录加进环境变量path,如果有的话就不用了
5.最后一步,将附件中的type-windows.xml拷贝进ImageMagick安装目录下的config目录,比如E:\ImageMagick-6.3.0-Q8\config,修改type.xml,原来是:


代码
<typemap> 
  <include file="type-ghostscript.xml" /> 
</typemap> 


修改为:


代码
<typemap> 
<include file="type-windows.xml" /> 
  <!-- <include file="type-ghostscript.xml" /> --> 
</typemap> 

1.在windows上安装Rmagic,如果你是通过gem安装的,

require ’Rmagic’

要修改为:

require ’rubygems’
require ’Rmagick’

才能正确引入。


2.网上那个例子,画布是使用Rmagic内置的图像格式,Rmagic内置的图像格式还有:

gradient*

梯度,比如gradient:red-blue

granite

花岗石,比如: "granite:".

logo

logo型的图像. 如: "logo:",后面会多显示一个五角星^_^

netscape

非常漂亮的彩条。如: "netscape:"

null*

空白 使用方式: "null:"

rose

玫瑰 使用方式 : "rose:"

xc*

设置一个背景色,比如”xc:green”

一个修改的例子,在rails的models下存为noisy_image.rb,在Controller就可以这样调用NoisyImage.new(4) :

ruby 代码
  1. require 'rubygems'    
  2. require 'Rmagick'   
  3. class NoisyImage   
  4.   include Magick   
  5.   attr_reader :code:code_image  
  6.   Jiggle = 15   
  7.   Wobble = 15   
  8.      
  9.   def initialize(len)   
  10.     chars = ('a'..'z').to_a - ['a','e','i','o','u']   
  11.     code_array=[]   
  12.     1.upto(len) {code_array << chars[rand(chars.length)]}   
  13.     granite = Magick::ImageList.new('xc:#EDF7E7')   
  14.     canvas = Magick::ImageList.new  
  15.     canvas.new_image(32*len, 50, Magick::TextureFill.new(granite))   
  16.     text = Magick::Draw.new  
  17.     text.font_family = 'times'   
  18.     text.pointsize = 40   
  19.     cur = 10   
  20.        
  21.     code_array.each{|c|   
  22.       rand(10) > 5 ? rot=rand(Wobble):rot= -rand(Wobble)   
  23.       rand(10) > 5 ? weight = NormalWeight : weight = BoldWeight   
  24.       text.annotate(canvas,0,0,cur,30+rand(Jiggle),c){   
  25.         self.rotation=rot   
  26.         self.font_weight = weight   
  27.         self.fill = 'green'   
  28.       }   
  29.       cur += 30   
  30.     }   
  31.     @code = code_array.to_s   
  32.     @code_image = canvas.to_blob{   
  33.       self.format="JPG"    
  34.     }   
  35.   end  
  36.      
  37. end  
  38.   

3.与rails应用的结合,和一般的验证码原理一样,将产生的随机数存储在session或者request范围内,提交的时候进行比较验证即可。比如产生图片的时候将随机字母存储在session[:code]中:

def register
    session[:noisy_image] = NoisyImage.new(4) #生成一个有4字符的图片
    session[:code] = session[:noisy_image].code
  
end

验证的时候,比较提交的type_code与session[:code]即可,为了安全性考虑,最好还是不考虑使用客户端验证。

 def code_check
    if params[:code]!=session[:noisy_image].code
         render_text "<script>document.getElementById('r_form').code.focus();</script> 验证码错误!"
    else
        render_text ""
    end  
  end

controller.rb具体代码如下:

java 代码
  1. class UserController < ApplicationController   
  2.   model:noisy_image   
  3. def code_check   
  4.     if params[:code]!=session[:noisy_image].code   
  5.          render_text "<script>document.getElementById('r_form').code.focus();</script> 验证码错误!"  
  6.     else  
  7.         render_text ""  
  8.     end      
  9.   end   
  10. def register   
  11.     session[:noisy_image] = NoisyImage.new(5) #生成一个有5字符的图片   
  12.     session[:code] = session[:noisy_image].code   
  13.      
  14.   end   
  15.      
  16.   def code_image   
  17.     image = session[:noisy_image].code_image   
  18.     send_data image, :type => 'image/jpeg', :disposition => 'inline'   
  19.   end   
  20.   end  

 

在页面显示图片,类似servlet一样直接调用Controller的action:

在register.rhtml中加入以下代码:

ruby 代码
ruby 代码
  1. "/user/code_image">  

 

分享到:
评论
1 楼 stworthy 2007-09-05  
有没有不要Rmagic的验证码解决方法?

相关推荐

    rails实现验证码实例

    在Ruby on Rails(Rails)框架中,验证码是一种用于防止恶意自动化的工具,它通常用于注册、登录和其他敏感操作,以确保只有人类用户能够执行这些操作。在这个实例中,我们将探讨如何在Rails应用中实现验证码功能。 ...

    twilio:Ruby on Rails 与 Twilio API

    综上所述,这个项目是一个使用Ruby on Rails开发的Web应用,它利用Twilio API实现短信发送功能。开发者需要对Ruby、Rails以及Twilio API有一定的了解,同时,可能涉及到前端表单验证、数据库交互、路由配置、控制器...

    kekocho:单页响应式Web应用程序,用于回答和回答由Ruby on Rails,Redux和React创建的Quora启发的问题

    未维护Kekocho现场版TLDR; Kekocho是一个完全响应的单页应用程序(SPA)Quora克隆,是一个...技术: - Ruby on Rails- React- Redux代管Kekocho托管在heroku上。 根据heroku.com的说法,“ Heroku是一个平台即服务

    Rails实现的简历系统

    在本文中,我们将深入探讨如何使用Ruby on Rails(Rails)框架构建一个简历系统。Rails是一个流行的Web应用程序开发框架,它遵循MVC(模型-视图-控制器)架构模式,简化了开发过程。以下是对标题和描述中涉及的关键...

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

    【ror-codelit-landing:基于 Ruby on Rails 的登陆页面】是一个使用 Ruby on ...通过分析项目源码,我们可以深入理解 Ruby on Rails 如何与 JavaScript 配合构建现代 Web 应用,以及如何设计和实现一个安全的登录系统。

    rails登陆注册

    在Ruby on Rails框架中,构建用户登录和注册功能是Web应用程序开发中的常见任务。Rails提供了许多内置工具和库,使得这个过程相对简单高效。在这个"rails登陆注册"的主题中,我们将探讨如何在Rails应用中实现用户...

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

    一个插件,可以使在Rails中创建负验证码的过程更加轻松 1.传输中未加密的数据 所有敏感数据(例如,登录凭据,PII,公司数据)在移动时均应进行加密或哈希处理。 通过SSL提供安全的连接。 确保Rails config.force_...

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

    其中,Macaron是一个非常流行的MVC Web框架,它借鉴了Ruby on Rails的设计理念,提供了丰富的中间件和插件支持,使得开发者可以便捷地构建高效、可维护的Web服务。而`Package captcha`就是专门为Macaron框架设计的一...

    Laravel开发-laravel

    Laravel由Taylor Otwell创建,其设计灵感来源于Ruby on Rails。Laravel的核心特性包括艺术化的路由、简单的数据库迁移系统、强大的Eloquent ORM(对象关系映射)、方便的单元测试以及一套全面的工具,如Artisan...

    Cakephp 入门实例(本人亲自撰写,非转载代码)

    PHP语言下非常优秀的MVC框架,其设计理念来自于Ruby On Rails框架,尤其适合中小型网站的开速开发。 本例子中包含了使用CAKEPHP中最基本的入门的例子,包括数据的增删改、查询、分页、验证码功能,基本的登录验证,...

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

    在实现"sms_confirmable"模块时,首先需要集成一个短信服务提供商,如Twilio、Nexmo或SendGrid,这些服务商提供了API供开发者调用,用于发送和接收短信。在Rails应用中,你需要配置相应的API密钥和服务端点。 在...

    网页中用户注册

    - 使用Node.js、Django、Ruby on Rails等后端框架处理注册请求,验证数据并保存至数据库。 - 数据库设计:考虑如何设计用户表,确保数据安全性和一致性。 8. **异常处理**: - 错误提示:当用户输入不符合要求时...

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

    在实际应用中,这款模板可以与后端框架(如PHP、Node.js、Django或Ruby on Rails)结合,通过AJAX技术实现无刷新的登录验证,提供更加流畅的操作流程。同时,配合服务器端的安全措施,如CSRF令牌、数据加密等,确保...

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

    本篇文章主要介绍了一种在Ruby on Rails搭建的博客应用中屏蔽垃圾留言的简单方法,无需使用验证码,而是巧妙利用JavaScript来实现。 垃圾留言通常由自动化程序批量发送,这些程序无法执行网页上的JavaScript代码。...

    google-auth-react:使用Google Auth登录的ReactJS的Bootstrap项目

    该项目是通过引导的。... 使用AJAX请求获取数据与API后端集成节点Ruby on Rails 在开发中代理API请求配置代理后出现“无效的主机头”错误手动配置代理配置WebSocket代理在开发中使用HTTPS 在服务器上生成动态&lt;met

    《书安》-第六期_安全冷兵器.pdf

    文档中包含了对一些特定安全漏洞的月报分析,例如Ruby on Rails动态渲染远程代码执行漏洞(CVE-2016-0752)、Python特性在Jinja2模板中的远程代码执行、WTForms URL XSS漏洞、Xstream反序列化漏洞等。这些漏洞分析...

    你在做网站时需要的源码

    在构建网站的过程中,源码是实现功能和设计的基础。源码是编程语言编写的文本...在实际项目中,还需要不断学习和适应新的技术和趋势,如前端框架React和Vue.js,以及后端框架Express和Ruby on Rails等,以保持竞争力。

Global site tag (gtag.js) - Google Analytics