溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP驗(yàn)證碼的示例分析

發(fā)布時(shí)間:2021-08-27 09:39:16 來源:億速云 閱讀:144 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)PHP驗(yàn)證碼的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

拓展

我們需要開啟gd拓展,可以使用下面的代碼來查看是否開啟gd拓展。

<?php

echo "Hello World!!!!";

echo phpinfo();
?>

然后在瀏覽器上Ctrl+F查找gd選項(xiàng)即可驗(yàn)證自己有沒有裝這個(gè)拓展,如果沒有的話,還需要自己全裝一下這個(gè)拓展。

背景圖

imagecreatetruecolor

默認(rèn)生成黑色背景

<?php
// 使用gd的imagecreatetruecolor();創(chuàng)建一張背景圖
$image = imagecreatetruecolor(100,30);
// 在顯示這張圖片的時(shí)候一定要先聲明頭信息
header('content-type:image/png');

imagepng($image);

// 釋放資源,銷毀執(zhí)行對(duì)象
imagedestroy($image);

imagecolorallocate

創(chuàng)建一個(gè)填充色,并用imagefill(image,x,y,color)方法來附著。

<?php
// 使用gd的imagecreatetruecolor();創(chuàng)建一張背景圖
$image = imagecreatetruecolor(100,30);

// 生成填充色
$bgcolor = imagecolorallocate($image,255,255,255);
// 將填充色填充到背景圖上
imagefill($image,0,0,$bgcolor);
// 在顯示這張圖片的時(shí)候一定要先聲明頭信息
header('content-type:image/png');

imagepng($image);

// 釋放資源,銷毀執(zhí)行對(duì)象
imagedestroy($image);

imagepng

在使用這個(gè)方法之前,一定要先設(shè)置頭信息,否則不會(huì)正常的顯示圖片 

imagedestory(image)

適時(shí)的釋放資源會(huì)減輕對(duì)服務(wù)器請(qǐng)求的壓力。 

簡(jiǎn)易數(shù)字驗(yàn)證碼

imagecolorallocate

生成顏色信息,方便待會(huì)的賦予處理。

$fontcolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));

imagestring

把內(nèi)容信息寫到圖片的相應(yīng)位置上。

imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);

增加識(shí)別干擾

//增加點(diǎn)

// 生成一些干擾的點(diǎn),這里是200個(gè)
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個(gè)
for($i=0;$i<5;$i++){
  // 設(shè)置為淺色的線,防止喧賓奪主
  $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);

}

 數(shù)字字母混合驗(yàn)證碼

<?php
// 使用gd的imagecreatetruecolor();創(chuàng)建一張背景圖
$image = imagecreatetruecolor(100,40);

// 生成填充色
$bgcolor = imagecolorallocate($image,255,255,255);
// 將填充色填充到背景圖上
imagefill($image,0,0,$bgcolor);

//////// 生成隨機(jī)4位字母以及數(shù)字混合的驗(yàn)證碼
for($i=0;$i<4;$i++){
  $fontsize = rand(6,8);
  $fontcolor = imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));
  // 為了避免用戶難于辨認(rèn),去掉了某些有歧義的字母和數(shù)字
  $rawstr = 'abcdefghjkmnopqrstuvwxyz23456789ABCDEFGHJKLMNOPQRSTUVWXYZ';
  $fontcontent = substr($rawstr,rand(0,strlen($rawstr)),1);
  // 避免生成的圖片重疊
  $x += 20;
  $y = rand(10,20);
  imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);  
}

// 生成一些干擾的點(diǎn),這里是200個(gè)
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個(gè)
for($i=0;$i<4;$i++){
  // 設(shè)置為淺色的線,防止喧賓奪主
  $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);

// 釋放資源,銷毀執(zhí)行對(duì)象
imagedestroy($image);

使用驗(yàn)證碼

開啟session的時(shí)機(jī)

注意: 開啟session一定要在開始的地方 

驗(yàn)證的原理

驗(yàn)證的過程就是客戶端輸入的驗(yàn)證碼和存在于session域中的驗(yàn)證碼進(jìn)行對(duì)比。即:

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();
  }

優(yōu)化驗(yàn)證

但是簡(jiǎn)單的這樣驗(yàn)證有一點(diǎn)不好的地方,那就是字母的大小寫容易出錯(cuò)。所以我們要做一下轉(zhuǎn)換,將用戶輸入的數(shù)值全部變成小寫的。

if(strtolower($_REQUEST['checkcode'])==$_SESSION['checkcode']){···}

小案例

生成驗(yàn)證碼

<?php
session_start();// 必須在php的最開始部分聲明,來開啟session


// 使用gd的imagecreatetruecolor();創(chuàng)建一張背景圖
$image = imagecreatetruecolor(100,40);

// 生成填充色
$bgcolor = imagecolorallocate($image,255,255,255);
// 將填充色填充到背景圖上
imagefill($image,0,0,$bgcolor);

//////// 生成隨機(jī)4位字母以及數(shù)字混合的驗(yàn)證碼
$checkcode='';
for($i=0;$i<4;$i++){
  $fontsize = rand(6,8);
  $fontcolor = imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));
  // 為了避免用戶難于辨認(rèn),去掉了某些有歧義的字母和數(shù)字
  $rawstr = 'abcdefghjkmnopqrstuvwxyz23456789';
  $fontcontent = substr($rawstr,rand(0,strlen($rawstr)),1);
  // 拼接即將誕生的驗(yàn)證碼
  $checkcode.=$fontcontent;
  // 避免生成的圖片重疊
  $x += 20;
  $y = rand(10,20);
  imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);  
}
// 保存到session變量中
$_SESSION['checkcode']=$checkcode;

// 生成一些干擾的點(diǎn),這里是200個(gè)
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個(gè)
for($i=0;$i<4;$i++){
  // 設(shè)置為淺色的線,防止喧賓奪主
  $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);

// 釋放資源,銷毀執(zhí)行對(duì)象
imagedestroy($image);

表單驗(yàn)證

<?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>驗(yàn)證驗(yàn)證碼信息</title>
  <script>
    function change(){
      document.getElementById("image_checkcode").src='./store.php?r='+Math.random(); 
    }
  </script>
</head>
<body>
<form action="./form.php" method="post">
<p>驗(yàn)證碼圖片:</p><img id="image_checkcode" src="./store.php?r=<?php echo rand();?>"  /><a href="javascript:void(0)" onclick="change()">看不清楚</a><br/>
請(qǐng)輸入驗(yàn)證碼<input type="text" name="checkcode" /><br />
<p><input type="submit" value="提交" /></p>


</form>

</body>
</html>

感謝各位的閱讀!關(guān)于“PHP驗(yàn)證碼的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI