驗證碼的分析
登入註冊頁面設定驗證碼主要是為了防止暴力破解、惡意註冊等情況的發生,是屬於網站的標配內容,到今天已經發展成將驗證碼直接發送到用戶手機或郵箱進行驗證,本節只做最簡單的圖片驗證碼的驗證,大家可以通過本節,了解驗證碼驗證的原理
產生驗證碼的簡單流程圖
具體的實作請看下面的內容
產生驗證碼背景圖
#1.開啟php的GD擴充
#開啟php.ini文件,將extension=php_gd2.dll這項的註解去掉,開啟它,如果本來是開啟的則不需要改變
接下來,我們來製作一個60X15的白色背景圖片
2.建立畫布
畫布,一種資源型數據。可以操作的圖像資源。
建立新畫布(新建)
#ImageCreate(寬,高),建立基於調色板的畫布。
imageCreateTrueColor(寬,高);建立真彩色的畫布。
基於圖片建立畫布(開啟)
imageCreateFromJPEG(圖片位址);
#imageCreateFromPNG (圖片位址);
imageCreateFromGIF(圖片位址);
我們建立一個真彩色的畫布:
$width=60;
$height=15;
//建立畫布
$img=imageCreateTrueColor($width,$height);
大家可以嘗試使用var_dump();將$ img輸出查看其類似是不是資源類型
3.操作畫布
#分配顏色:如果需要在畫布上使用某個顏色,應該先將顏色分配到畫布上。
使用函數:
顏色識別 = imageColorAllocate(畫布,R,G,B);
//分配顏色
$white = imageColorAllocate($img,0xff,0xff,0xff);
填充畫布:將填滿點,連續並且顏色相同的點進行填充(替換)
使用函數:
imageFill(畫布, 填滿位置x, 填滿位置Y,顏色標識)完成
位置採用座標進行管理:
原點:0,0,畫布的左上角。
向右,x軸增加,向下Y軸增加。
//填滿顏色到畫布
imageFill($img,0,0,$white);
#4.輸出畫布
將畫布中處理好的圖樣訊息,輸出出來。
典型的:
輸出到圖片檔案。
直接輸出。
使用函數:
imagePNG(畫布[, 檔案位址])://在指定位址產生檔案
imageJPEG();//在網頁上直接輸出,我們的驗證碼採取這種方式
imageGIF();//同上一個
如果沒有第二個參數,表示直接輸出。
直接輸出到瀏覽器,需要告知瀏覽器,回應資料的類型應該是PNG格式的圖片:
使用指令Content-type
##//直接輸出
header('Content-Type:image/jpeg;');
imageJPEG($img);
註:一個畫布可以輸出多次,輸出為各種格式!
5.銷毀畫布資源
#使用函數:imageDestroy();imageDestroy( $img);
#產生驗證碼的值
1.首先必須定義所以可能出現的字符,取得所有字符的總長度以及我們要產生的驗證碼的長度##代碼如下:
//產生驗證碼的值$chars = '1234567890';//所以可能出現的字元$chars_len=strlen($chars);
$code_len=4;//驗證碼的長度
$code='';//初始化驗證碼字串
#2.分四次,每次從所有可能出現的字元中取出一個數字,最後將四位數字連結在一起,產生驗證碼的值
for($i=1;$i<=$code_len;++$ i){ $rand=mt_rand(0,$chars_len-1);//隨機取0-9中的任一個數字 $code.=$rand;//將取出的數位連結在一起
}
3.開啟session,將驗證碼值存入session中,用於驗證
//存入session中,用於驗證------------------------session_start();$_SESSION[ ' ver_code']=$code;
將驗證碼值放入驗證碼背景圖片中
1.為驗證碼值分配隨機顏色
//隨機分配字串顏色$str_color=imageColorAllocate($img,mt_rand(0,255 ),mt_rand(0,255),mt_rand(0,255));
2.讓驗證碼值居中寫在背景圖上面# //計算字串的居中 #3.輸出驗證碼 ##//直接輸出imageJPEG($img); 完整程式碼如下
//字串大小
$font=5;
//畫布尺寸
$img_w=imageSX($img);
$img_h=imageSY($img);
//字體的尺寸
$font_w=imagefontwidth($font);
$font_h=imagefontheight($font);
//字串的尺寸
$code_w=$font_w*$code_len;
$code_h=$font_h;
$x=($img_w-$code_w)/2;
$y=($img_h-$code_h )/2;
//把驗證碼輸出到畫布上----------------------------
imageString($ img,$font,$x,$y,$code,$str_color);
imageDestroy($img);<?php
//生成验证码背景图---------------------------------
header('Content-Type:image/jpeg;');
//背景图尺寸
$width=60;
$height=15;
//创建画布
$img=imageCreateTrueColor($width,$height);
//分配颜色
$white = imageColorAllocate($img,0xff,0xff,0xff);
//填充颜色到画布
imageFill($img,0,0,$white);
//生成验证码的值----------------------------------
$chars = '1234567890';//所以可能出现的字符
$chars_len=strlen($chars);
$code_len=4;//验证码的长度
$code='';//初始化验证码字符串
for($i=1;$i<=$code_len;++$i){
$rand=mt_rand(0,$chars_len-1);//随机取0-9中的任意一个数字
$code.=$rand;//将取出来的数字连接在一起
}
//存入session中,用于验证-------------------------
session_start();
$_SESSION['ver_code']=$code;
//随机分配字符串颜色------------------------------
$str_color=imageColorAllocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
//计算字符串的居中
//字符串大小
$font=5;
//画布尺寸
$img_w=imageSX($img);
$img_h=imageSY($img);
//字体的尺寸
$font_w=imagefontwidth($font);
$font_h=imagefontheight($font);
//字符串的尺寸
$code_w=$font_w*$code_len;
$code_h=$font_h;
$x=($img_w-$code_w)/2;
$y=($img_h-$code_h)/2;
//把验证码输出到画布上----------------------------
imageString($img,$font,$x,$y,$code,$str_color);
//直接输出
imageJPEG($img);
imageDestroy($img);
?>