PHP驗證碼淺析
擴充
我們需要開啟gd擴充,可以使用下面的程式碼來檢視是否開啟gd擴充。
<?php
echo "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
session_start();// 必須在php的最開始部分宣告,來開啟session
// 使用gd的imagecreatetruecolor();建立一張背景圖
$image = imagecreatetruecolor(100,40);
// 生成填充色
$bgcolor = imagecolorallocate($image,255,255,255);
// 將填充色填充到背景圖上
imagefill($image,0,0,$bgcolor);
//////// 生成隨機4位字母以及數字混合的驗證碼
$checkcode=``;
for($i=0;$i<4;$i++){
$fontsize = rand(6,8);
$fontcolor = imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));
// 為了避免使用者難於辨認,去掉了某些有歧義的字母和數字
$rawstr = `abcdefghjkmnopqrstuvwxyz23456789`;
$fontcontent = substr($rawstr,rand(0,strlen($rawstr)),1);
// 拼接即將誕生的驗證碼
$checkcode.=$fontcontent;
// 避免生成的圖片重疊
$x += 20;
$y = rand(10,20);
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
// 儲存到session變數中
$_SESSION[`checkcode`]=$checkcode;
// 生成一些干擾的點,這裡是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);
表單驗證
<?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
- PHP 驗證身份證號碼PHP
- PHP行為驗證碼PHP
- PHP驗證碼的製作PHP
- PHP算式驗證碼和漢字驗證碼的實現方法PHP
- 一個漂亮的PHP驗證碼PHP
- PHP Clourse(閉包類) 淺析PHP
- Redux原始碼淺析Redux原始碼
- redux 原始碼淺析Redux原始碼
- Koa 原始碼淺析原始碼
- webmagic原始碼淺析Web原始碼
- 淺析Redux原始碼Redux原始碼
- ARouter原始碼淺析原始碼
- PHP 攻擊簡訊驗證碼介面PHP
- PHP簡訊驗證碼防刷方案PHP
- PHP 與 Swoole 淺析與學習PHP
- 超簡單的PHP驗證碼識別PHP
- Discuz! Q 原始碼淺析原始碼
- Lifecycle原始碼淺析原始碼
- quicklink原始碼淺析UI原始碼
- RecyclerView動畫原始碼淺析View動畫原始碼
- String原始碼淺析原始碼
- Guava原始碼淺析——JoinerGuava原始碼
- LinkedList原始碼淺析原始碼
- ThreadLocal 原始碼淺析thread原始碼
- php短視訊原始碼,自動生成驗證碼,支援點選更換驗證碼數字PHP原始碼
- Java 8 API 設計經驗淺析JavaAPI
- PHP 身份證精確匹配驗證PHP
- 驗證碼原理及驗證
- 5種PHP生成圖片驗證碼例項PHP
- 蘋果內購二次驗證 PHP程式碼蘋果PHP
- 淺析 PHP7 的垃圾回收機制PHP
- 淺析php中的異常與錯誤PHP
- react原始碼淺析(三):ReactElementReact原始碼
- react原始碼淺析(三):ReactChildrenReact原始碼
- RXSwift原始碼淺析(二)Swift原始碼
- String 原始碼淺析(一)原始碼