詳細介紹PHP驗證碼實作的原理
拓展
我們需要開啟gd拓展,可以使用下面的程式碼來檢視是否開啟gd拓展。
<?phpecho "Hello World!!!!";echo phpinfo();?>
然後在瀏覽器上Ctrl+F
查找gd選項即可驗證自己有沒有裝這個拓展,如果沒有的話,還需要自己全裝一下這個拓展。
背景圖
imagecreatetruecolor
預設產生黑色背景
<?php // 使用gd的 imagecreatetruecolor();创建一张背景图 $image = imagecreatetruecolor(100,30);// 在显示这张图片的时候一定要先声明头信息 header('content-type:image/png'); imagepng($image);// 释放资源,销毁执行对象imagedestroy($image);
imagecolorallocate
建立一個填滿色,並用imagefill(image,x ,y,color)方法來附著。
<?php // 使用gd的 imagecreatetruecolor();创建一张背景图 $image = imagecreatetruecolor(100,30);// 生成填充色 $bgcolor = imagecolorallocate($image,255,255,255);// 将填充色填充到背景图上 imagefill($image,0,0,$bgcolor);// 在显示这张图片的时候一定要先声明头信息 header('content-type:image/png'); imagepng($image);// 释放资源,销毁执行对象imagedestroy($image);
imagepng
在使用這個方法之前,一定要先設定頭訊息,否則不會正常的顯示圖片
imagedestory(image)
適時的釋放資源會減輕對伺服器請求的壓力。
簡易數字驗證碼
imagecolorallocate
#產生顏色訊息,方便待會的賦予處理。
$fontcolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));
imagestring
把內容資訊寫到圖片的對應位置。
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
增加識別幹擾
增加點
// 生成一些干扰的点,这里是200个 for($i=0;$i<200;$i++){ $pointcolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255)); imagesetpixel($image,rand(0,100),rand(0,30),$pointcolor); }
增加線
// 生成一些干扰线 这里是5个 for($i=0;$i<5;$i++){ // 设置为浅色的线,防止喧宾夺主 $linecolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255)); imageline($image,rand(0,99),rand(0,29),rand(0,99),rand(0,29),$linecolor); }
數字字母混合驗證碼
<?php // 使用gd的imagecreatetruecolor();创建一张背景图 $image = imagecreatetruecolor(100,40);// 生成填充色 $bgcolor = imagecolorallocate($image,255,255,255);// 将填充色填充到背景图上 imagefill($image,0,0,$bgcolor);//////// 生成随机4位字母以及数字混合的验证码 for($i=0;$i<4;$i++){ $fontsize = rand(6,8); $fontcolor = imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255)); // 为了避免用户难于辨认,去掉了某些有歧义的字母和数字 $rawstr = 'abcdefghjkmnopqrstuvwxyz23456789ABCDEFGHJKLMNOPQRSTUVWXYZ'; $fontcontent = substr($rawstr,rand(0,strlen($rawstr)),1); // 避免生成的图片重叠 $x += 20; $y = rand(10,20); imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor); }// 生成一些干扰的点,这里是200个for($i=0;$i<200;$i++){ $pointcolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255)); imagesetpixel($image,rand(0,100),rand(0,30),$pointcolor); } // 生成一些干扰线 这里是4个for($i=0;$i<4;$i++){ // 设置为浅色的线,防止喧宾夺主 $linecolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255)); imageline($image,rand(0,99),rand(0,29),rand(0,99),rand(0,29),$linecolor); } header('content-type:image/png'); imagepng($image);// 释放资源,销毁执行对象imagedestroy($image);
使用驗證碼
開啟session的時機
## 驗證的原理 驗證的過程就是客戶端輸入的驗證碼和存在於session域中的驗證碼進行比較。即:注意: 開啟session一定要在開始的地方
if(isset($_REQUEST['checkcode'])){ session_start(); if($_REQUEST['checkcode']==$_SESSION['checkcode']){ echo "<font color='green'>Success!</font>"; }else{ echo "<font color='red'>Failed!</font>"; } exit(); }
if(strtolower($_REQUEST['checkcode'])==$_SESSION['checkcode']){···}
登入後複製
表單驗證登入後複製
<?php
header("Content-Type:text/html;charset=utf8");
if(isset($_REQUEST['checkcode'])){
session_start();
if(strtolower($_REQUEST['checkcode'])==$_SESSION['checkcode']){
echo "<font color='green'>Success!</font>";
}else{
echo "<font color='red'>Failed!</font>";
}
exit();
}?>
<!DOCTYPE html><html><head>
<meta charset="utf-8" />
<title>验证验证码信息</title>
<script>
function change(){
document.getElementById("image_checkcode").src='./store.php?r='+Math.random();
} </script></head><body><form action="./form.php" method="post"><p>验证码图片:</p>
<img id="image_checkcode" src="./store.php?r=<?php echo rand();?>" />
<a href="javascript:void(0)" onclick="change()">看不清楚</a>
<br/>请输入验证码<input type="text" name="checkcode" /><br /><p>
<input type="submit" value="提交" /></p></form>
</body></html>
登入後複製總結最後,來個總結吧。
<?php header("Content-Type:text/html;charset=utf8"); if(isset($_REQUEST['checkcode'])){ session_start(); if(strtolower($_REQUEST['checkcode'])==$_SESSION['checkcode']){ echo "<font color='green'>Success!</font>"; }else{ echo "<font color='red'>Failed!</font>"; } exit(); }?> <!DOCTYPE html><html><head> <meta charset="utf-8" /> <title>验证验证码信息</title> <script> function change(){ document.getElementById("image_checkcode").src='./store.php?r='+Math.random(); } </script></head><body><form action="./form.php" method="post"><p>验证码图片:</p> <img id="image_checkcode" src="./store.php?r=<?php echo rand();?>" /> <a href="javascript:void(0)" onclick="change()">看不清楚</a> <br/>请输入验证码<input type="text" name="checkcode" /><br /><p> <input type="submit" value="提交" /></p></form> </body></html>
- 使用php製作驗證碼需要gd拓展的支援。
- 使用imagecreatetruecolor方法產生背景色,並用imagefill填滿一個由imagecolorallocate產生的顏色。
- 使用imagestring來實作驗證碼和背景圖的結合
- 使用imagesetpixel來新增幹擾點
- #使用imageline來新增幹擾線
- 使用session之前要在開頭開啟session_start()方法
- 使用JavaScript來動態的修改驗證碼的src,來滿足使用者「換一張」的需求。 #
以上是詳細介紹PHP驗證碼實作的原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
