php CI框架实现验证码功能和增强验证码安全性实战教程

CodeIgniter简称CI是最流行的一个php MVC框架之一,本人讲从实际项目使用中写系列实战经验,有别与其他的理论讲解文章,会附上实战流程和代码。

第一篇为大多数项目使用到的安全验证码,例如用户登录、注册、留言板、意见反馈、论坛防灌水等地方都会用到。

文章将默认你已经配置好php开发环境(本人使用的是XAMPP)和CodeIgniter基础项目了,采用MVC三个部分分开讲解。

主要内容来源于本人原创百度经验 php CodeIgniter 实战教程:[1]安全验证码_百度经验
http://jingyan.baidu.com/article/5d6edee229748b99eadeecfb.html

C(Controller) 有三个方法,1.显示界面,如登录界面。2.获取验证码或看不清重新获取验证码。3.提交表单后验证填入的验证码是否正确。

下面为详细代码,关键地方有详细注释说明addsite.php:

 <?php 

 class Addsite extends CI_Controller {

 function __construct(){

 parent::__construct();

 }

 function index(){  

   $this->load->model('addsitemodel');  

 $this->load->helper('url'); 

 $this->load->view('addsiteview',$data);

 }

 function rand_create(){

 session_start();

 //生成验证码图片

 header("Content-type: image/png");

 //要显示的字符,可自己进行增删

 $str = "1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,m,n,p,q,r,s,t,y,z";

 $list = explode(",", $str);

 $cmax = count($list) - 1;

 $verifyCode = '';

 for ( $i=0; $i < 5; $i++ ){

 $randnum = mt_rand(0, $cmax);

 //取出字符,组合成验证码字符

 $verifyCode .= $list[$randnum];

 }

 //避免程序读取session字符串破解,生成的验证码用MD5加密一下再放入session,提交的验证码md5以后和seesion存储的md5进行对比

 //直接md5还不行,别人反向md5后提交还是可以的,再加个特定混淆码再md5强度才比较高,总长度在14位以上

 //网上有反向md5的 Rainbow Table,64GB的量几分钟内就可以搞定14位以内大小写字母、数字、特殊字符的任意排列组合的MD5反向

 //但这种方法不能避免直接分析图片上的文字进行破解,生成gif动画比较难分析出来

 //加入前缀、后缀字符,prestr endstr 为自定义字符,将最终字符放入SESSION中

 $_SESSION['randcode'] =  md5("prestr".$verifyCode."endstr");

 //生成图片

 $im = imagecreate(58,28);

 //此条及以下三条为设置的颜色

 $black = imagecolorallocate($im, 0,0,0);

 $white = imagecolorallocate($im, 255,255,255);

 $gray = imagecolorallocate($im, 200,200,200);

 $red = imagecolorallocate($im, 255, 0, 0);

 //给图片填充颜色

 imagefill($im,0,0,$white);

 //将验证码写入到图片中

 imagestring($im, 5, 10, 8, $verifyCode, $black);

 //加入干扰象素

 for($i=0;$i<50;$i++)

 {

 $randcolor = ImageColorallocate($im,rand(0,255),rand(0,255),rand(0,255)); 

         imagesetpixel($im, rand()%70 , rand()%30 , $randcolor); 

 }

 imagepng($im);

 imagedestroy($im);

 }

 function add(){

 $this->load->model('addsitemodel');

 $this->load->helper('url');

 session_start();

 $randcode = md5("prestr".$this->input->post('randcode')."endstr");//prestr endstr 要对应上面放入session的字符串

 if($randcode != $_SESSION['randcode']){

 $data['result'] = "对不起,验证码输入错误,请重试!";

 $this->load->view('addsite_result_view',$data);

 return;

 }

 //其他业务逻辑代码

 }

 }

V(view) 有两个界面:1.显示界面addsiteview.php,2.验证失败界面addsite_result_view.php。

这里先说明显示界面,在实战中发现如果默认在界面中用php调用生成验证码的方法会导致浏览器后退的时候验证码仍然是旧的,这样就不能很好起到防灌水作用,所以采用页面加载后用js调用的方式读取验证码。需要加入jquery脚本库,其他脚本库改下初始化加载方法就可以了。

注意事项
默认你已经配置好php开发环境和CodeIgniter基础项目
php环境要开通GD库支持,widow环境和XAMPP一般默认开通了
需要加入jquery脚本库,其他脚本库改下初始化加载方法就可以了

-----------------------------------------------------------------

更多详细信息请访问 php CodeIgniter 实战教程:[1]安全验证码_百度经验
http://jingyan.baidu.com/article/5d6edee229748b99eadeecfb.html

php CI框架实现验证码功能和增强验证码安全性实战教程的更多相关文章

  1. SpringSceurity(4)---短信验证码功能实现

    SpringSceurity(4)---短信验证码功能实现 有关SpringSceurity系列之前有写文章 1.SpringSecurity(1)---认证+授权代码实现 2.SpringSecur ...

  2. CodeIgniter(CI)框架中的验证码

    在CodeIgniter框架中,CI本身自带了验证码,但是查看文档的时候,发现: 需要新建一个表,用来存储验证码信息.因为习惯了session存储验证码信息,所以我把我认为比较好看的验证码应用在了CI ...

  3. 一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架

    问题:3行代码 PDF.NET是一个开源的数据开发框架,它的特点是简单.轻量.快速,易上手,而且是一个注释完善的国产开发框架,受到不少朋友的欢迎,也在我们公司的项目中多次使用.但是,PDF.NET比起 ...

  4. CI框架主题切换的功能

    CI框架主题切换的功能 本人接触到这个框架不就,属于菜鸟 , 公司现在用CI框架做项目 ,老大要做一个主题切换的功能,说明功能的要求我的脑子里瞬间有几个想法. 脑子里最简单的就是设置全局变量 如 : ...

  5. Tornado框架实现图形验证码功能

    图形验证码是项目开发过程中经常遇到的一个功能,在很多语言中都有对应的不同形式的图形验证码功能的封装,python 中同样也有类似的封装操作,通过绘制生成一个指定的图形数据,让前端HTML页面通过链接获 ...

  6. CI框架2.x的验证码中所遇问题解决

    用php版本是5.6,CI框架版本是2.x,在使用验证码(captcha)时,遇到一些问题. 首先,我查看框架手册,说必需的两个参数是"img_url",“img_path”,其他 ...

  7. JAVA 实现 QQ 邮箱发送验证码功能(不局限于框架)

    JAVA 实现 QQ 邮箱发送验证码功能(不局限于框架) 本来想实现 QQ 登录,有域名一直没用过,还得备案,好麻烦,只能过几天再更新啦. 先把实现的发送邮箱验证码更能更新了. 老规矩,更多内容在注释 ...

  8. CI框架整合UEditor编辑器上传功能

    最近项目中要使用到富文本编辑器,选用了功能强大的UEditor,接下来就来讲讲UEditor编辑器的上传功能整合. 本文UEditor版本:ueditor1_4_3_utf8_php版本 第一步:部署 ...

  9. S2SH框架中的无刷新验证码功能实现

    暑假期间在实验室做使用S2SH框架的项目,其中登录和注册需要验证码,实现了一个没有实现刷新验证码功能的简单版本,代码如下: 1 package com.sem.action; 2 3 import j ...

随机推荐

  1. React 事件处理函数

    触摸事件:onTouchCancel\onTouchEnd\onTouchMove\onTouchStart (只会在移动设备上接受) 键盘事件:onKeyDown\onKeyPress\onKeyU ...

  2. 2-sat入门(tarjan)hdu(3062)

    hdu3062 Party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  3. PostgreSql数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)

    查询表信息(表名/表描述) select a.relname as name , b.description as value from pg_class a ) b on a.oid = b.obj ...

  4. Jmeter(十一)_针对响应信息不明确的接口做关联

    下午写一个新功能的接口脚本,遇到几个技术问题,现在将解决方案写出来 1:做接口关联的时候,发现接口响应没有可以利用的信息.如下图只返回了一个成功的标识,这样的接口如何与之关联? 通过抓包观察后续的修改 ...

  5. (4.15)存储DAS,NAS,SAN在数据库存储上的应用

    关键词:存储,硬盘接口类型,磁盘类型,网络类型,DAS,DNS,SAN 转自:http://blog.51cto.com/qianzhang/1254617 一. 硬盘接口类型 1. 并行接口还是串行 ...

  6. android studio常用控件

    1.Button设置不同的样式 <?xml version="1.0" encoding="utf-8"?> <selector xmlns: ...

  7. 超级详细的RedGateSqlServer工具教程,效率提高的不止一点点之SQLPrompt

    距离上次SQLDoc教程贴过去2个月了,时间真快,好了,废话不多说,继续 http://pan.baidu.com/share/link?shareid=177401896&uk=330822 ...

  8. 循环结构 for

    for格式:for(初始化表达式;循环条件表达式;循环后的操作表达式) { 执行语句:循环体 } ------------------------------------ -------------- ...

  9. opencv之颜色过滤只留下图片中的红色区域

    如图,这次需要在图片中找到卷尺的红色刻度,所以需要对图像做过滤,只留下红色部分. 一开始的想法是分别找到RGB值,然后找到红色区域的部分保留就可以了,不过好像很难确定红色区域的RGB取值范围,所以要把 ...

  10. spring-data-mongodb关于id的坑

    有如下Mongo记录: 在Java中对应2个类来表示此结构: public class SG_IMAGERELATION { @Id private String id; private int gi ...