詳解PHP如何完成驗(yàn)證碼功能示例
引言
在使用php開(kāi)發(fā)程序的時(shí)候,特別是在用戶注冊(cè)登錄的頁(yè)面,如果不設(shè)置驗(yàn)證碼功能,很有可能被人利用工具,批量注冊(cè)賬號(hào)或者暴力破解用戶賬號(hào)信息,對(duì)網(wǎng)站或者用戶造成損失。那么php如何完成驗(yàn)證碼功能呢?
一、驗(yàn)證碼的生成
我們可以寫(xiě)一個(gè)yzm.php文件,用來(lái)生成動(dòng)態(tài)的驗(yàn)證碼圖片。代碼如下:
<?php session_start(); // 生成隨機(jī)驗(yàn)證碼 $charset = '0123456789ABCDEFGHIJKLMNPQRSTUVWXYZabcvbnmasdfghjkpiuytrewq'; $randomString = ''; $length = 6; // 驗(yàn)證碼長(zhǎng)度 $charsetLength = strlen($charset) - 1; for ($i = 0; $i < $length; $i++) { $randomString .= $charset[random_int(0, $charsetLength)]; } // 保存驗(yàn)證碼到session中 $_SESSION['captcha'] = $randomString; // 創(chuàng)建驗(yàn)證碼圖片 $image = imagecreatetruecolor(120, 40); $bgColor = imagecolorallocate($image, 255, 255, 255); $textColor = imagecolorallocate($image, 0, 0, 0); // 填充背景色 imagefilledrectangle($image, 0, 0, 120, 40, $bgColor); // 在圖片上繪制驗(yàn)證碼 imagestring($image, 5, 40, 10, $randomString, $textColor); // 發(fā)送圖像頭部到瀏覽器 header('Content-Type: image/png'); // 輸出圖像到瀏覽器 imagepng($image); // 銷毀圖像資源 imagedestroy($image); ?>
上面的代碼可以從“0123456789ABCDEFGHIJKLMNPQRSTUVWXYZabcvbnmasdfghjkpiuytrewq”這一串字符串中隨機(jī)選擇6個(gè)字符作為驗(yàn)證碼,并命名為$_SESSION['captcha']存入服務(wù)器SESSION中,方便后續(xù)進(jìn)行驗(yàn)證。當(dāng)然生成的驗(yàn)證碼圖片你可以進(jìn)行更多的裝飾,這里就不贅述了。
二、驗(yàn)證碼的調(diào)用
我們往往在注用戶冊(cè)或者登錄的頁(yè)面需要告訴用戶驗(yàn)證碼是多少,讓用戶準(zhǔn)確輸入驗(yàn)證碼。
<div id="popup" class="popup"> <div class="popup-inner"> <center><h3>用戶注冊(cè)</h3></center> <span class="button-close" onclick="closePopup()">×</span> <form id="joinForm" action="sub.php" method="POST"> <div class="form-group"> <label for="username">賬號(hào):</label> <input type="text" id="username" name="username" placeholder="請(qǐng)輸入賬號(hào)" required> </div> <div class="form-group"> <label for="userpass">密碼:</label> <input type="pass" id="userpass" name="userpass" placeholder="請(qǐng)輸密碼" required> </div> <div class="form-group"> <label for="captcha">驗(yàn)證碼:<img class="ue-image" src="yzm.php"/></label> <input type="text" id="captcha" name="captcha" placeholder="請(qǐng)輸入驗(yàn)證碼" required> </div> <div class="form-group"> <div class="button-group"> <button type="submit">提交</button> </div> </div> </form> </div> </div>
可以看到,在注冊(cè)頁(yè)面,我們直接使用以下代碼展示生成的驗(yàn)證碼:
<img class="ue-image" src="yzm.php"/>
當(dāng)然你也可以直接調(diào)用$_SESSION['captcha']來(lái)展示驗(yàn)證碼,但是為了驗(yàn)證功能的有效性和安全性,這里不建議直接調(diào)用$_SESSION['captcha']函數(shù)。
三、驗(yàn)證碼的驗(yàn)證
當(dāng)用戶輸入驗(yàn)證碼以后,我們需要對(duì)驗(yàn)證碼進(jìn)行驗(yàn)證,判斷用戶是否準(zhǔn)確輸入了驗(yàn)證碼。如果用戶未能準(zhǔn)確輸入驗(yàn)證碼,則php文件不再繼續(xù)執(zhí)行后面的代碼。
<?php session_start();//首先開(kāi)啟session if(!empty($_POST)){ $username = $_POST['username']; $userpass = $_POST['userpass']; $captcha = $_POST['captcha']; if (!preg_match('/^[A-Za-z0-9]+$/', $captcha)) { echo '<script>alert("驗(yàn)證碼不正確!"); window.location.href = "index.php";</script>';exit; }//這里使用正則判斷驗(yàn)證碼的合法性,如果驗(yàn)證碼未按0-9和a-Z的規(guī)則輸入則提示驗(yàn)證碼不正確并返回首頁(yè)。 if($captcha!=$_SESSION['captcha']){ echo '<script>alert("驗(yàn)證碼不正確!"); window.location.href = "index.php";</script>';exit; }//這里判斷用戶輸入的驗(yàn)證碼是否與yzm.php生成的驗(yàn)證碼一直 ,如果不一致則提示驗(yàn)證碼不正確并返回首頁(yè)。 //如果驗(yàn)證碼正確,則繼續(xù)執(zhí)行下面的代碼 ....... // } ?>
當(dāng)然本文只是簡(jiǎn)單介紹php如何設(shè)計(jì)驗(yàn)證碼功能,實(shí)際開(kāi)發(fā)中可能需要更完善更豐富的功能,需要對(duì)以上代碼進(jìn)行完善和修改。
php編程語(yǔ)言是一款十分簡(jiǎn)單容易上手的編程語(yǔ)言,非常適合新手學(xué)習(xí)。
以上就是PHP如何完成驗(yàn)證碼功能的詳細(xì)內(nèi)容,更多關(guān)于PHP如何完成驗(yàn)證碼功能的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHP實(shí)現(xiàn)微信支付(jsapi支付)和退款(無(wú)需集成支付SDK)流程教程詳解
本篇文章給大家介紹PHP實(shí)現(xiàn)微信支付(jsapi支付)和退款(無(wú)需集成支付SDK)流程教程詳解,使用了微信官方給的php版本的sdk,但是在使用過(guò)程中有很多問(wèn)題,今天給大家講講不集成支付SDK直接調(diào)用支付接口實(shí)現(xiàn)支付和退款,感興趣的朋友一起看看吧2018-03-03php實(shí)現(xiàn)批量上傳數(shù)據(jù)到數(shù)據(jù)庫(kù)(.csv格式)的案例
下面小編就為大家?guī)?lái)一篇php實(shí)現(xiàn)批量上傳數(shù)據(jù)到數(shù)據(jù)庫(kù)(.csv格式)的案例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06CI框架AR操作(數(shù)組形式)實(shí)現(xiàn)插入多條sql數(shù)據(jù)的方法
這篇文章主要介紹了CI框架AR操作實(shí)現(xiàn)插入多條sql數(shù)據(jù)的方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了CI框架使用數(shù)組實(shí)現(xiàn)多條數(shù)據(jù)插入的方法,需要的朋友可以參考下2016-05-05thinkPHP+PHPExcel實(shí)現(xiàn)讀取文件日期的方法(含時(shí)分秒)
這篇文章主要介紹了thinkPHP+PHPExcel實(shí)現(xiàn)讀取文件日期的方法,可實(shí)現(xiàn)針對(duì)時(shí)分秒的形式進(jìn)行讀取的功能,涉及PHPExcel中ExcelToPHP函數(shù)的相關(guān)使用方法,需要的朋友可以參考下2016-07-07laravel5實(shí)現(xiàn)微信第三方登錄功能
這篇文章主要介紹了laravel5實(shí)現(xiàn)微信第三方登錄功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12destoon二次開(kāi)發(fā)模板及調(diào)用語(yǔ)法匯總
這篇文章主要介紹了destoon二次開(kāi)發(fā)模板及調(diào)用語(yǔ)法,需要的朋友可以參考下2014-06-06在swoole中制作一款仿制laravel的框架的實(shí)例代碼
這篇文章主要介紹了在swoole中制作一款仿制laravel的框架,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03php利用fsockopen GET/POST提交表單及上傳文件
這篇文章主要為大家詳細(xì)介紹了php利用fsockopen GET/POST提交表單及上傳文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05