Gem Rails 有比较好的验证码插件么?

inetufo · 2012年01月08日 · 最后由 huacnlee 回复于 2017年02月14日 · 10731 次阅读

哪位仁兄推荐一个

共收到 26 条回复

captcha相关的就是recaptcha这个gem,也就是google的那个recaptcha,这个不是给中国人用的。其他的就没有写好的gem了吧,有也是过时的东西。直接用jquery的就行了。。自己实现一下。

嗯嗯 欢迎围观我的视频验证码"印象码"⋯⋯ http://ruby-china.org/topics/752 最近忙着做产品 明天抽空把Gem完善一下

recaptcha 这玩意经常都看不清他上面的字母。。。要刷新N次。。。

#3楼 @inetufo 用户体验始终是个大问题。所以我们现在开始搞视频验证码了。。容易辨认、不易破解⋯⋯

#3楼 @inetufo 雖然都叫 recaptcha 但是名字一樣,內容不同啊。我們去年的項目中我就遇到這個問題了,當時Rails的版本是 3.0.3 我試過 gem 'simple_captcha', :git => 'git://github.com/galetahub/simple-captcha.git' 後來證明這玩意是個渣,別走我老路了。 最後選了 gem 'recaptcha', :require => 'recaptcha/rails' 相對來說這個還可以,要做 Ajax 方式的註冊的話,自己需要重寫它的一個Helper方法。不過半年多過去了,也許這個 Bug 已經被修好了。

你也可以試試下面幾個,選擇適合你的 https://bitbucket.org/mml/ruby-recaptcha/wiki/Home http://github.com/achiu/rack-recaptcha https://github.com/ambethia/recaptcha/

我之前的几个项目是用这个: https://github.com/huacnlee/captcha 但是我发现被人破解了 没被破解,之前的漏洞是微博登陆导致的。

7 楼 +1

#5楼 @Victor 能否说下 simple_captcha 渣表现在哪些地方?大概看了下貌似还成,是容易被破解?

#9楼 @anylei 是不是容易被破解我也不清楚,問問 @southwolf 吧,他做视频验证码似乎對如何防止破解比較有心得。怎麼渣我實在說不好,我覺得渣的地方可能是不符合我的習慣。

另外 @rookylu 說的 simple_captcha 的項目地址是 https://github.com/beaucollins/simple_captcha 而我以前用的那個項目地址是 https://github.com/galetahub/simple-captcha 大家說的不是同一個。所以我在回帖裡面先說了雖然名字接近,但是內容不同。

#10楼 @Victor 谢谢,我还当是有什么硬伤。

#7楼 @huacnlee 被破解了是什么意思? 一般验证码都可以设置背景噪点和文字扭曲程度吧,很难识别的...

#12楼 @hooopo 關於被破解的問題可以看看 #2楼 @southwolf 的帖子 http://ruby-china.org/topics/752 下面的回帖值得一看哦

#13楼 @Victor 那个帖子的场景是每天产生固定量的验证码。。simple captcha是动态生成,不存在被碰撞破解的情况

#14楼 @hooopo 我最初用的那個 simple captcha 是調用 google 的。整體的效果就是刺瞎我的狗眼也很難分辨出到底是啥字母。而且速度巨慢啊。根本不能定製什麼特殊的圖片效果。破解我確實不懂,所以讓他看看別人的回帖會有一些參考價值。

#12楼 @hooopo 我那个被破解的原因是由于生成的数量有限,被“碰撞破解”了 http://ruby-china.org/topics/752#15

#16楼 @huacnlee 原来这个验证码就是Generate a bunch of images off-line 我一直想不明白 为什么不动态生成?为了性能? 我觉得越是这样越容易被人刷,如果动态生成验证码可能开始会浪费一些资源,但是碰撞破解的人看到根本碰撞不了的时候也就不会继续刷了。

@huacnlee 你好,我在用easy_captcha遇到了这样的问题。Started GET "/captcha?i=1343537519" for 127.0.0.1 at 2012-07-29 12:52:00 +0800

RuntimeError (can't modify frozen string): actionpack (3.2.1) lib/action_dispatch/http/parameters.rb:47:in force_encoding' actionpack (3.2.1) lib/action_dispatch/http/parameters.rb:47:inencode_params' actionpack (3.2.1) lib/action_dispatch/http/parameters.rb:59:in block in encode_params' actionpack (3.2.1) lib/action_dispatch/http/parameters.rb:52:ineach' actionpack (3.2.1) lib/action_dispatch/http/parameters.rb:52:in `encode_params ... 请问你遇到过这样的问题吗?

#19楼 @ailen 这个问题已经解决了,有人打了补丁并被作者合并进源码了,最新的0.5.0版本应该已经修复了。不过那个版本依赖bundler 1.0.X,反而0.4.5版可以和bundler 1.1.X兼容。。。我就是中枪了。github上的源码已经修复了bundler依赖的问题。如果你是bundler 1.1.X,只能在Gemfile里指定源了

gem 'easy_captcha', :git => 'https://github.com/phatworx/easy_captcha.git'

reCaptcha 是强大,但字符辨识率太低,要刷新好几次。

#18楼 @huacnlee 试了一下,验证码很好很漂亮,但…… 我怎么判断提交过来的值对不对呢……

找到了验证的方法:

if captcha_valid?(params[:captcha])
    p "~~~~~~~~~~~~~~~~~~~~"
end

但有一个奇怪的问题,就是这个验证老是不对,后来开Firebug查了一下,发现 它会一次产生两个码,生效的是我看不见的这个(标2的那个) 我的html.erb文件如下:

<h1>Login111#login</h1>
<p>Find me in app/views/login/login.html.erb</p>
<form>
    <p><%= captcha_tag %></p>
    <p><%= text_field_tag :captcha %></p>
    <p><%= submit_tag 'Validate' %></p>
</form>

controller就没什么了:

class LoginController < ApplicationController
    def login
        if captcha_valid?(params[:captcha])
            p "~~~~~~~~~~~~~~~~~~~~"
        end
    end
end

跪求解……

验证码用皕应的HCaptcha吧,不错,能解决问题,我们站被注册机搞死了,搞了2,3个月,后来我老大的同学推荐用皕应的,现在问题彻底解决,不过Ruby好像没有例子,皕应的官网 http://www.hinsite.com

easy_captcha 生成的验证码,在验证一次错误的以后,session的值就丢失了。

#24楼 @clarkyi easy_captcha需要设置cache才可以

piginzoo 悲催一下午的验证码噩梦 中提及了此贴 06月17日 14:30
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册