用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2438|回复: 0
收起左侧

转发 http://www.utubon.com/268/

[复制链接]
发表于 2013-7-14 15:27:45 | 显示全部楼层 |阅读模式
ci中的验证码captcha详解 2012年7月11日23:31 由否子戈发布 查看674次 1条评论
分享 分类:PHP开发框架 标签:CodeIgniter 适读者:程序猿

在codeigniter中,系统提供了一套验证码图片的方案,例如captcha辅助函数,我们可以设计自己的图片验证码。
官方手册中虽然也有提到,但是并不详细,本文针对网站中的验证码进行一个详细的讲解。
在控制器中,加入如下的代码:
$this->load->helper('captcha');$vals = array(        'word' => rand(1000, 10000),        'img_path' => './data/captcha/',        'img_url' => base_url('data/captcha').'/',        'font_path' => './system/fonts/texb.ttf',        'img_width' => 120,        'img_height' => 30,        'expiration' => 7200);$cap = create_captcha($vals);$data['captcha'] = $cap['image'];$this->session->set_flashdata('captcha_word',$cap['word']);这段代码即让该控制器创建了一个验证码图片。我们先对创建过程详解,后文再来增加提交验证部分。
$this->load->helper('captcha')将该系统的辅助函数载入,create_captcha参数数组中,img_path的一个相对于系统根目录的文件夹,它将用来保存暂时的验证码图片。img_url是图片<img>的src地址,即调用地址,是一个网址形式。这两个值是必须的,决定着你的图片地址和存放位置。
word是要显示的字,这里采用了一个rand()来随机得到一个四位数。你也可以通过自己的方法,创建其他验证码,例如英文字母。这也是我们在后面要用来输入和验证的关键内容。
font_pat是文字的字体文件位置,CI提供了一个,你可以像我一样直接使用它。至于width和height不用解释,expiration是指更新过期的时间。而$cap = create_captcha($vals);就是创建了一个验证码对象,它包含了验证码图片、word、创建时间等,你可以像一个数组一样使用这些属性。
接下来讲解输入验证码和提交验证部分。
在上面的代码中,乌徒帮增加了
$data['captcha'] = $cap['image'];$this->session->set_flashdata('captcha_word',$cap['word']);两句,它们是用来创建数据的,我们在后面的程序中$this->load->view('register/register',$data);加载了视图,在视图文件中直接echo $captcha就显示出一张图片,记住,$captcha不是图片的地址,而是图片<img>。同时,在这张图片的边上放上一个<input type="text">让用户可以输入验证码,我给的name='captcha_word'。
而$this->session->set_flashdata('captcha_word',$cap['word']);一句是增加了一个闪存session,用来保存$cap['word'],即文字,只有当用户提交的内容中,验证码等于这个session时才验证通过。如何验证呢?我使用的是一个条件判断语句
if($this->session->flashdata('captcha_word') != $this->input->post('captcha_word'))
之所以要使用flash session闪存,是为了让验证码的文字信息使用之后随即消除,既和每次的验证码随机同步,又不占用空间。
从验证码图片的创建,到在视图中显示图片,再通过创建<input>和利用session对输入的验证信息进行验证,整个过程还是很清楚的。官方还给出了将captcha和数据库结合起来进行验证的方法,具体请参考官方手册的对应一节,本文不述。

本版积分规则