《PHP編程:php制作動態(tài)隨機(jī)驗(yàn)證碼》要點(diǎn):
本文介紹了PHP編程:php制作動態(tài)隨機(jī)驗(yàn)證碼,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP實(shí)戰(zhàn)驗(yàn)證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區(qū)分計(jì)算機(jī)和人類的圖靈測試)的縮寫,是一種區(qū)分用戶是計(jì)算機(jī)還是人的公共全自動程序.可以防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試,實(shí)際上用驗(yàn)證碼是現(xiàn)在很多網(wǎng)站通行的方式,我們利用比較簡易的方式實(shí)現(xiàn)了這個功能.
PHP實(shí)戰(zhàn)????? 這個問題可以由計(jì)算機(jī)生成并評判,但是必須只有人類才能解答.由于計(jì)算機(jī)無法解答CAPTCHA的問題,所以回答出問題的用戶就可以被認(rèn)為是人類.
PHP實(shí)戰(zhàn)????? Php制作動態(tài)驗(yàn)證碼是基于php的圖像處理,下面首先介紹一下php的圖像處理.
PHP實(shí)戰(zhàn)一.php圖像處理簡介
PHP實(shí)戰(zhàn)????? 在PHP5中,動態(tài)圖象的處理要比以前容易得多.PHP5在php.ini文件中包含了GD擴(kuò)展包,只需去掉GD擴(kuò)展包的相應(yīng)注釋就可以正常使用了.PHP5包含的GD庫正是升級的GD2庫,其中包含支持真彩圖像處理的一些有用的JPG功能.
PHP實(shí)戰(zhàn)????? 一般生成的圖形,通過PHP的文檔格式存放,但可以通過HTML的圖片插入方式SRC來直接獲取動態(tài)圖形.比如,驗(yàn)證碼、水印、微縮圖等.
PHP實(shí)戰(zhàn)????? 創(chuàng)建圖像的一般流程:
PHP實(shí)戰(zhàn)1).設(shè)定標(biāo)頭,告訴瀏覽器你要生成的MIME類型.
PHP實(shí)戰(zhàn)2).創(chuàng)建一個圖像區(qū)域,以后的操作都將基于此圖像區(qū)域.
PHP實(shí)戰(zhàn)3).在空白圖像區(qū)域繪制填充背景.
PHP實(shí)戰(zhàn)4).在背景上繪制圖形輪廓輸入文本.
PHP實(shí)戰(zhàn)5).輸出最終圖形.
PHP實(shí)戰(zhàn)6).清除所有資源.
PHP實(shí)戰(zhàn)7).其他頁面調(diào)用圖像.
PHP實(shí)戰(zhàn)第一步,設(shè)置文件MIME類型,輸出類型 將輸出類型改成圖像流
代碼如下:
header('Content-Type: image/png;');
PHP實(shí)戰(zhàn)一般生成的圖像可以是png,jpeg,gif,wbmp
PHP實(shí)戰(zhàn)第二步,創(chuàng)建一個圖形區(qū)域,圖像背景
PHP實(shí)戰(zhàn)imagecreatetruecolor() 返回一個圖像標(biāo)識符,代表了一幅大小為 x_size 和 y_size 的黑色圖像.語法:resource imagecreatetruecolor ( int $width , int $height )
代碼如下:
$im = imagecreatetruecolor(200,200);
PHP實(shí)戰(zhàn)第三步,在空白圖像區(qū)域繪制填充背景
PHP實(shí)戰(zhàn)要有顏色填充器;imagecolorallocate -- 為一幅圖像分配顏色;語法:int imagecolorallocate ( resource $image , int $red , int $green , int $blue )
代碼如下:
$blue = imagecolorallocate($im,0,102,255);
PHP實(shí)戰(zhàn)將這個blue顏色填充到背景上去;imagefill -- 區(qū)域填充;語法:bool imagefill ( resource $image , int $x , int $y , int $color )
代碼如下:
imagefill($im,0,0,$blue);
PHP實(shí)戰(zhàn)第四步,在藍(lán)色的背景上輸入一些線條,文字等
PHP實(shí)戰(zhàn)顏色填充器
代碼如下:
$white = imagecolorallocate($im,255,255,255);
PHP實(shí)戰(zhàn)畫兩條線段:imageline
PHP實(shí)戰(zhàn)imageline() 用 color 顏色在圖像 image 中從坐標(biāo) x1,y1 到 x2,y2(圖像左上角為 0, 0)畫一條線段.語法:bool imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )
代碼如下:
imageline($im,0,0,200,200,$white);
imageline($im,200,0,0,200,$white);
PHP實(shí)戰(zhàn)水平地畫一行字符串:imagestring
PHP實(shí)戰(zhàn)imagestring() 用 col 顏色將字符串 s 畫到 image 所代表的圖像的 x,y 坐標(biāo)處(這是字符串左上角坐標(biāo),整幅圖像的左上角為 0,0).如果font 是 1,2,3,4 或 5,則使用內(nèi)置字體.語法:bool imagestring ( resource $image , int $font , int $x , int $y , string $s , int $col )
代碼如下:
imagestring($im,5,66,20,'jingwhale',$white);
PHP實(shí)戰(zhàn)第五步,輸出最終圖形
PHP實(shí)戰(zhàn)imagepng() 將 GD 圖像流(image)以 PNG 格式輸出到標(biāo)準(zhǔn)輸出(通常為瀏覽器),或者如果用 filename 給出了文件名則將其輸出到該文件.語法:bool imagepng ( resource $image [, string $filename ] )
代碼如下:
imagepng($im);
PHP實(shí)戰(zhàn)第六步,我要將所有的資源全部清空
PHP實(shí)戰(zhàn)imagedestroy() 釋放與 image 關(guān)聯(lián)的內(nèi)存.語法:bool imagedestroy ( resource $image )
代碼如下:
imagedestroy($im);
PHP實(shí)戰(zhàn)其他頁面(html)調(diào)用創(chuàng)建的圖形
代碼如下:
<img src="Demo4.php" alt="PHP創(chuàng)建的圖片" />
PHP實(shí)戰(zhàn)示例代碼如下:
代碼如下:
<?php
??? //第一步,設(shè)置文件MIME類型
??? header('Content-Type: image/png;');
??? //第二步,創(chuàng)建一個圖形區(qū)域,圖像背景
??? $im = imagecreatetruecolor(200,200);
??? //第三步,在空白圖像區(qū)域繪制填充背景
??? $blue = imagecolorallocate($im,0,102,255);???
??? imagefill($im,0,0,$blue);
??? //第四步,在藍(lán)色的背景上輸入一些線條,文字等
??? $white = imagecolorallocate($im,255,255,255);
??? imageline($im,0,0,200,200,$white);
??? imageline($im,200,0,0,200,$white);
??? imagestring($im,5,66,20,'Jing.Whale',$white);
??? //第五步,輸出最終圖形
??? imagepng($im);
??? //第六步,我要將所有的資源全部清空
??? imagedestroy($im);???
?>
PHP實(shí)戰(zhàn)顯示效果:
PHP實(shí)戰(zhàn)![PHP編程:php制作動態(tài)隨機(jī)驗(yàn)證碼]()
PHP實(shí)戰(zhàn)二.創(chuàng)建動態(tài)驗(yàn)證碼
PHP實(shí)戰(zhàn)附:代碼源地址https://github.com/cnblogs-/php-captcha
PHP實(shí)戰(zhàn)1. 創(chuàng)建帶驗(yàn)證碼的圖片,并模糊背景
PHP實(shí)戰(zhàn)隨機(jī)碼采用16進(jìn)制;模糊背景即在圖片背景加上線條、雪花等.
PHP實(shí)戰(zhàn)1)創(chuàng)建隨機(jī)碼
??
代碼如下:
for ($i=0;$i<$_rnd_code;$i++) {
??????? $_nmsg .= dechex(mt_rand(0,15));
??? }
string dechex ( int $number ),返回一字符串,包含有給定 number 參數(shù)的十六進(jìn)制表示.
PHP實(shí)戰(zhàn)2)保存在session
?
代碼如下:
$_SESSION['code'] = $_nms
PHP實(shí)戰(zhàn)3)創(chuàng)建圖片
代碼如下:
//創(chuàng)建一張圖像
$_img = imagecreatetruecolor($_width,$_height);
//白色
$_white = imagecolorallocate($_img,255,255,255);
//填充
imagefill($_img,0,0,$_white);
if ($_flag) {
//黑色,邊框
??? $_black = imagecolorallocate($_img,0,0,0);
??? imagerectangle($_img,0,0,$_width-1,$_height-1,$_black);
}
PHP實(shí)戰(zhàn)4)模糊背景
代碼如下:
//隨機(jī)畫出6個線條
for ($i=0;$i<6;$i++) {
?? $_rnd_color = imagecolorallocate($_img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
?? imageline($_img,mt_rand(0,$_width),mt_rand(0,$_height),mt_rand(0,$_width),mt_rand(0,$_height),$_rnd_color);
?? }
//隨機(jī)雪花
for ($i=0;$i<100;$i++) {
?? $_rnd_color = imagecolorallocate($_img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
?? imagestring($_img,1,mt_rand(1,$_width),mt_rand(1,$_height),'*',$_rnd_color);
?? }
PHP實(shí)戰(zhàn)5)輸出及銷毀
代碼如下:
//輸出驗(yàn)證碼
for ($i=0;$i<strlen($_SESSION['code']);$i++) {
??????? $_rnd_color = imagecolorallocate($_img,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200));
??????? imagestring($_img,5,$i*$_width/$_rnd_code+mt_rand(1,10),mt_rand(1,$_height/2),$_SESSION['code'][$i],$_rnd_color);
??? }
//輸出圖像
header('Content-Type: image/png');
imagepng($_img);
//銷毀
imagedestroy($_img);
PHP實(shí)戰(zhàn)將其封裝在global.func.php全局函數(shù)庫中,函數(shù)名為_code(),以便調(diào)用.我們將設(shè)置$_width ,$_height ,$_rnd_code,$_flag 四個參數(shù),以增強(qiáng)函數(shù)的靈活性.
PHP實(shí)戰(zhàn)* @param int $_width 驗(yàn)證碼的長度:如果要6位長度推薦75+50;如果要8位,推薦75+50+50,依次類推
* @param int $_height 驗(yàn)證碼的高度
* @param int $_rnd_code 驗(yàn)證碼的位數(shù)
* @param bool $_flag 驗(yàn)證碼是否需要邊框:true有邊框, false無邊框(默認(rèn))
PHP實(shí)戰(zhàn)封裝后的代碼如下:
代碼如下:
<?php
/**
?*????? [verification-code] (C)2015-2100 jingwhale.
?*?????
?*????? This is a freeware
?*????? $Id: global.func.php 2015-02-05 20:53:56 jingwhale$
?*/
/**
?* _code()是驗(yàn)證碼函數(shù)
?* @access public
?* @param int $_width 驗(yàn)證碼的長度:如果要6位長度推薦75+50;如果要8位,推薦75+50+50,依次類推
?* @param int $_height 驗(yàn)證碼的高度
?* @param int $_rnd_code 驗(yàn)證碼的位數(shù)
?* @param bool $_flag 驗(yàn)證碼是否需要邊框:true有邊框, false無邊框(默認(rèn))
?* @return void 這個函數(shù)執(zhí)行后產(chǎn)生一個驗(yàn)證碼
?*/
function _code($_width = 75,$_height = 25,$_rnd_code = 4,$_flag = false) {
??? //創(chuàng)建隨機(jī)碼
??? for ($i=0;$i<$_rnd_code;$i++) {
??????? $_nmsg .= dechex(mt_rand(0,15));
??? }
??? //保存在session
??? $_SESSION['code'] = $_nmsg;
??? //創(chuàng)建一張圖像
??? $_img = imagecreatetruecolor($_width,$_height);
??? //白色
??? $_white = imagecolorallocate($_img,255,255,255);
??? //填充
??? imagefill($_img,0,0,$_white);
??? if ($_flag) {
??????? //黑色,邊框
??????? $_black = imagecolorallocate($_img,0,0,0);
??????? imagerectangle($_img,0,0,$_width-1,$_height-1,$_black);
??? }
??? //隨即畫出6個線條
??? for ($i=0;$i<6;$i++) {
??????? $_rnd_color = imagecolorallocate($_img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
??????? imageline($_img,mt_rand(0,$_width),mt_rand(0,$_height),mt_rand(0,$_width),mt_rand(0,$_height),$_rnd_color);
??? }
??? //隨即雪花
??? for ($i=0;$i<100;$i++) {
??????? $_rnd_color = imagecolorallocate($_img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
??????? imagestring($_img,1,mt_rand(1,$_width),mt_rand(1,$_height),'*',$_rnd_color);
??? }
??? //輸出驗(yàn)證碼
??? for ($i=0;$i<strlen($_SESSION['code']);$i++) {
??????? $_rnd_color = imagecolorallocate($_img,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200));
??????? imagestring($_img,5,$i*$_width/$_rnd_code+mt_rand(1,10),mt_rand(1,$_height/2),$_SESSION['code'][$i],$_rnd_color);
??? }
??? //輸出圖像
??? header('Content-Type: image/png');
??? imagepng($_img);
??? //銷毀
??? imagedestroy($_img);
}
?>
PHP實(shí)戰(zhàn)2.創(chuàng)建驗(yàn)證機(jī)制
PHP實(shí)戰(zhàn)創(chuàng)建php驗(yàn)證頁面,通過session來檢驗(yàn)驗(yàn)證碼是否一致.
PHP實(shí)戰(zhàn)1)創(chuàng)建verification-code.php驗(yàn)證頁面
代碼如下:
<?php
/**
?*????? [verification-code] (C)2015-2100 jingwhale.
?*
?*????? This is a freeware
?*????? $Id: verification-code.php 2015-02-05 20:53:56 jingwhale$
?*/
//設(shè)置字符集編碼
header('Content-Type: text/html; charset=utf-8');
?>
<!DOCTYPE html>
<html>
<head>
??? <meta charset="UTF-8">
??? <title>verification code</title>
??? <link rel="stylesheet" type="text/css" href="style/basic.css" />
</head>
<body>
??? <div id="testcode">
??????? <form method="post" name="verification" action="verification-code.php?action=verification">
??????????? <dl>
??????????????? <dd>驗(yàn)證碼:<input type="text" name="code" class="code" /><img src="codeimg.php" id="codeimg"? /></dd>
??????????????? <dd><input type="submit" class="submit" value="驗(yàn)證" /></dd>
??????????? </dl>
??????? </form>
??? </div>
</body>
</html>
PHP實(shí)戰(zhàn)顯示如下:
PHP實(shí)戰(zhàn)![PHP編程:php制作動態(tài)隨機(jī)驗(yàn)證碼]()
PHP實(shí)戰(zhàn)2)創(chuàng)建產(chǎn)生驗(yàn)證碼圖片頁面
PHP實(shí)戰(zhàn)創(chuàng)建codeimg.php為verification-code.php html代碼里的img提供驗(yàn)證碼圖片
PHP實(shí)戰(zhàn)首先必須在codeimg.php頁面開啟session;
PHP實(shí)戰(zhàn)其次,將我們封裝好的global.func.php全局函數(shù)庫引入進(jìn)來;
PHP實(shí)戰(zhàn)最后,運(yùn)行_code();
代碼如下:
<?php
/**
?*????? [verification-code] (C)2015-2100 jingwhale.
?*?????
?*????? This is a freeware
?*????? $Id: codeimg.php 2015-02-05 20:53:56 jingwhale$
?*/
//開啟session
session_start();
//引入全局函數(shù)庫(自定義)
require dirname(__FILE__).'/includes/global.func.php';
//運(yùn)行驗(yàn)證碼函數(shù).通過數(shù)據(jù)庫的_code方法,設(shè)置驗(yàn)證碼的各種屬性,生成圖片
_code(125,25,6,false);
?>
PHP實(shí)戰(zhàn)![PHP編程:php制作動態(tài)隨機(jī)驗(yàn)證碼]()
PHP實(shí)戰(zhàn)3)創(chuàng)建session檢驗(yàn)機(jī)制
PHP實(shí)戰(zhàn)首先必須在verification-code.php頁面也開啟session;
PHP實(shí)戰(zhàn)其次,設(shè)計(jì)提交驗(yàn)證碼的方式,本文以get方式提交,當(dāng)action=verification時提交成功;
PHP實(shí)戰(zhàn)最后,創(chuàng)建驗(yàn)證函數(shù),原理是將客戶端用戶提交的驗(yàn)證碼同服務(wù)器codeimg.php中session的驗(yàn)證碼是否一致;這里有一個js彈窗函數(shù)_alert_back(),我們也把它封裝在global.func.php里;
PHP實(shí)戰(zhàn)修改verification-code.php中php代碼如下:
代碼如下:
<?php
/**
?*????? [verification-code] (C)2015-2100 jingwhale.
?*
?*????? This is a freeware
?*????? $Id: verification-code.php 2015-02-05 20:53:56 jingwhale$
?*/
//設(shè)置字符集編碼
header('Content-Type: text/html; charset=utf-8');
//開啟session
session_start();
//引入全局函數(shù)庫(自定義)
require dirname(__FILE__).'/includes/global.func.php';
//檢驗(yàn)驗(yàn)證碼
if ($_GET['action'] == 'verification') {
??? if (!($_POST['code'] == $_SESSION['code'])) {
??????? _alert_back('驗(yàn)證碼不正確!');
??? }else{
??????? _alert_back('驗(yàn)證碼通過!');
??? }
}?
?>
<!DOCTYPE html>
<html>
<head>
??? <meta charset="UTF-8">
??? <title>verification code</title>
??? <link rel="stylesheet" type="text/css" href="style/basic.css" />
??? <script type="text/javascript" src="js/codeimg.js"></script>
</head>
<body>
??? <div id="testcode">
??????? <form method="post" name="verification" action="verification-code.php?action=verification">
??????????? <dl>
??????????????? <dd>驗(yàn)證碼:<input type="text" name="code" class="code" /><img src="codeimg.php" id="codeimg"? /></dd>
??????????????? <dd><input type="submit" class="submit" value="驗(yàn)證" /></dd>
??????????? </dl>
??????? </form>
??? </div>
</body>
</html>
PHP實(shí)戰(zhàn)![PHP編程:php制作動態(tài)隨機(jī)驗(yàn)證碼]()
PHP實(shí)戰(zhàn)3.實(shí)現(xiàn)點(diǎn)擊驗(yàn)證碼圖片更新驗(yàn)證碼
PHP實(shí)戰(zhàn)上面若想實(shí)現(xiàn)驗(yàn)證碼更新,必須刷新頁面;我們寫一個codeimg.js函數(shù)實(shí)現(xiàn)點(diǎn)擊驗(yàn)證碼圖片更新驗(yàn)證碼
代碼如下:
window.onload = function () {
??? var code = document.getElementById('codeimg');//通過id找到html中img標(biāo)簽
??? code.onclick = function () {//為標(biāo)簽添加點(diǎn)擊事件
??????? this.src='codeimg.php?tm='+Math.random();//修改時間,重新指向codeimg.php
??? };???
}
PHP實(shí)戰(zhàn)然后在verification-code.php html代碼head里<link>它即可.
PHP實(shí)戰(zhàn)![PHP編程:php制作動態(tài)隨機(jī)驗(yàn)證碼]()
歡迎參與《PHP編程:php制作動態(tài)隨機(jī)驗(yàn)證碼》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/12240.html