php CI框架實現驗證碼功能和加強驗證碼安全性實戰教程

php CI框架實現驗證碼功能和加強驗證碼安全性實戰教程php

CodeIgniter簡稱CI是最流行的一個php MVC框架之一,本人講從實際項目使用中寫系列實戰經驗,有別與其餘的理論講解文章,會附上實戰流程和代碼。html

第一篇爲大多數項目使用到的安全驗證碼,例如用戶登陸、註冊、留言板、意見反饋、論壇防灌水等地方都會用到。jquery

文章將默認你已經配置好php開發環境(本人使用的是XAMPP)和CodeIgniter基礎項目了,採用MVC三個部分分開講解。web

主要內容來源於本人原創百度經驗 php CodeIgniter 實戰教程:[1]安全驗證碼_百度經驗
http://jingyan.baidu.com/article/5d6edee229748b99eadeecfb.html瀏覽器

C(Controller) 有三個方法,1.顯示界面,如登陸界面。2.獲取驗證碼或看不清從新獲取驗證碼。3.提交表單後驗證填入的驗證碼是否正確。安全

下面爲詳細代碼,關鍵地方有詳細註釋說明addsite.php:session

  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腳本庫,其餘腳本庫改下初始化加載方法就能夠了。post

 

注意事項
默認你已經配置好php開發環境和CodeIgniter基礎項目
php環境要開通GD庫支持,widow環境和XAMPP通常默認開通了
須要加入jquery腳本庫,其餘腳本庫改下初始化加載方法就能夠了動畫

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

更多詳細信息請訪問 php CodeIgniter 實戰教程:[1]安全驗證碼_百度經驗
http://jingyan.baidu.com/article/5d6edee229748b99eadeecfb.html

相關文章
相關標籤/搜索