zoukankan      html  css  js  c++  java
  • php CI框架实现验证码功能和增强验证码安全性实战教程

    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

     

  • 相关阅读:
    vue实例讲解之vuex的使用
    实例讲解webpack的基本使用第一篇
    如何写一个jquery插件
    《改变你一生的108个心理学法则》读书笔记
    用css绘制各种图形
    关于js浮点数计算精度不准确问题的解决办法
    非常有用的css使用总结
    网页meta标签总结
    Object.defineProperty()方法的用法详解
    js中set和get的用法
  • 原文地址:https://www.cnblogs.com/zdz8207/p/3518994.html
Copyright © 2011-2022 走看看