设为首页 收藏本站
查看: 902|回复: 0

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

[复制链接]

尚未签到

发表于 2015-8-29 07:37:48 | 显示全部楼层 |阅读模式
  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:



  1 <?php
  2
  3 class Addsite extends CI_Controller {
  4
  5 function __construct(){
  6
  7 parent::__construct();
  8
  9 }
10
11  
12
13 function index(){  
14
15   $this->load->model('addsitemodel');  
16
17 $this->load->helper('url');
18
19 $this->load->view('addsiteview',$data);
20
21 }
22
23  
24
25 function rand_create(){
26
27 session_start();
28
29  
30
31 //生成验证码图片
32
33 header("Content-type: image/png");
34
35 //要显示的字符,可自己进行增删
36
37 $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";
38
39 $list = explode(",", $str);
40
41 $cmax = count($list) - 1;
42
43 $verifyCode = '';
44
45 for ( $i=0; $i < 5; $i++ ){
46
47 $randnum = mt_rand(0, $cmax);
48
49 //取出字符,组合成验证码字符
50
51 $verifyCode .= $list[$randnum];
52
53 }
54
55 //避免程序读取session字符串破解,生成的验证码用MD5加密一下再放入session,提交的验证码md5以后和seesion存储的md5进行对比
56
57 //直接md5还不行,别人反向md5后提交还是可以的,再加个特定混淆码再md5强度才比较高,总长度在14位以上
58
59 //网上有反向md5的 Rainbow Table,64GB的量几分钟内就可以搞定14位以内大小写字母、数字、特殊字符的任意排列组合的MD5反向
60
61 //但这种方法不能避免直接分析图片上的文字进行破解,生成gif动画比较难分析出来
62
63  
64
65 //加入前缀、后缀字符,prestr endstr 为自定义字符,将最终字符放入SESSION中
66
67 $_SESSION['randcode'] =  md5("prestr".$verifyCode."endstr");
68
69 //生成图片
70
71 $im = imagecreate(58,28);
72
73 //此条及以下三条为设置的颜色
74
75 $black = imagecolorallocate($im, 0,0,0);
76
77 $white = imagecolorallocate($im, 255,255,255);
78
79 $gray = imagecolorallocate($im, 200,200,200);
80
81 $red = imagecolorallocate($im, 255, 0, 0);
82
83 //给图片填充颜色
84
85 imagefill($im,0,0,$white);
86
87  
88
89 //将验证码写入到图片中
90
91 imagestring($im, 5, 10, 8, $verifyCode, $black);
92
93  
94
95 //加入干扰象素
96
97 for($i=0;$i<50;$i++)
98
99 {
100
101 $randcolor = ImageColorallocate($im,rand(0,255),rand(0,255),rand(0,255));
102
103         imagesetpixel($im, rand()%70 , rand()%30 , $randcolor);
104
105 }
106
107 imagepng($im);
108
109 imagedestroy($im);
110
111 }
112
113  
114
115 function add(){
116
117 $this->load->model('addsitemodel');
118
119 $this->load->helper('url');
120
121 session_start();
122
123 $randcode = md5("prestr".$this->input->post('randcode')."endstr");//prestr endstr 要对应上面放入session的字符串
124
125 if($randcode != $_SESSION['randcode']){
126
127 $data['result'] = "对不起,验证码输入错误,请重试!";
128
129 $this->load->view('addsite_result_view',$data);
130
131 return;
132
133 }
134
135 //其他业务逻辑代码
136
137  
138
139 }
140
141 }
  
  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
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-105681-1-1.html 上篇帖子: PHP导入导出Excel要领 下篇帖子: PHP在linux上编译安装手册
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表