在网站上注册用户时,网站会生成一张图片验证码,要求用户输入正确的验证码才能够完成注册。这套机制是为了
防止机器人注册大量的水号帐户。
如果你使用Rails开发的话,可以试试simple-captcha这个gem,此gem提供了许多API帮助你开发一套图片
captcha。但是我们现在想在Rails环境下手动打造一套图片captcha,以便理解更多关于captcha的细节。
Captcha流程
先是生成一个随机字符串label和一个uuid,字符串长度4-6个就好了,太长的话不方便用户输入,太短的话容易被
机器人破解,将uuid发送给图片生成器生成含有label字符的图片,最后验证时,将uuid和用户输入的字符串发送到
captcha验证器进行验证。在验证器里主要是通过uuid从数据库里找出用于生成图片的label,然后使用此
label和用户输入的文本进行对比。
将过程抽象为Activity
这里介绍我写的一个叫作Activity的类,此类专用于对过程进行抽象,帮助我们从面向过程的角度来解决一些编程
问题。
生成label和uuid
我用一个叫captcha_labels的表保存label和uuid, 在Rails中captcha_labels对应的model是CaptchaLabel
生成图片
需要使用ImageMagick和mini_magick
图片路径
首先增加路由, 在routes.rb文件中加入下面的代码
然后建立控制器,rails g controller captcha, 此命令会生成 CaptchaController,captcha_controller.rb文件的代
码如下,
在html里写入<img src=’/captcha?uuid=:uuid’>就能够得到一张验证码图片,:uuid用数据库里实际存在的值代替即可。
集成验证码
假设我们在用户注册时需要使用验证码来甄别人类和机器。首先,增加用于注册的路由,
生成用户注册控制器,rails g controller regist,生成RegistController,其内容如下(省去了和captcha无关的内容),
视图文件view/reigst/new.html.haml的内容如下(省去了和captcha无关的内容),