本文提供一個完整的 PHP 驗證碼生成類,模仿 QQ 註冊/登入時的驗證碼風格,支援 GD 庫繪圖、Session 儲存、防重複請求、多種干擾效果。
<?php
/**
* 仿 QQ 驗證碼
*/
// Session 存儲路徑設定
$sessSavePath = dirname(__FILE__) . "/../data/sessions/";
if (is_writeable($sessSavePath) && is_readable($sessSavePath)) {
session_save_path($sessSavePath);
}
session_start();
// 產生隨機字串
$rndstring = '';
for ($i = 0; $i < 4; $i++) {
$rndstring .= chr(mt_rand(65, 90));
}
$img_height = 45;
$img_width = 10;
if (function_exists("imagecreate")) {
// 防止 Firefox 短時間多次請求導致驗證碼變更
$ntime = time();
if (empty($_SESSION['dd_ckstr_last']) || empty($_SESSION['dd_ckstr']) || ($ntime - $_SESSION['dd_ckstr_last'] > 5)) {
$_SESSION['dd_ckstr'] = strtolower($rndstring);
$_SESSION['dd_ckstr_last'] = $ntime;
}
$rndstring = $_SESSION['dd_ckstr'];
$rndcodelen = strlen($rndstring);
// 建立圖片
$im = imagecreate(46, 20);
ImageColorAllocate($im, 240, 243, 248); // 背景色
// 干擾線
$lineColor1 = ImageColorAllocate($im, mt_rand(174,218), mt_rand(190,225), mt_rand(217,237));
for ($j = 1; $j <= 2; $j = $j + 3) {
imageline($im, 0, $j + mt_rand(1,15), 48, $j + mt_rand(1,15), $lineColor1);
}
// 繪製文字
$fontColor = ImageColorAllocate($im, mt_rand(0,150), mt_rand(0,150), mt_rand(0,150));
for ($i = 0; $i < $rndcodelen; $i++) {
$bc = mt_rand(0,1);
$rndstring[$i] = strtoupper($rndstring[$i]);
imagestring($im, mt_rand(3,5), $i * $img_height/4 + mt_rand(1,5), mt_rand(1, $img_width/2), $rndstring[$i], $fontColor);
}
// 防快取 Header
header("Pragma: no-cache\r\n");
header("Cache-Control: no-cache\r\n");
header("Expires: 0\r\n");
// 輸出圖片(優先 PNG)
if (function_exists("imagepng")) {
header("content-type: image/png\r\n");
imagepng($im);
} else {
header("content-type: image/jpeg\r\n");
imagejpeg($im);
}
ImageDestroy($im);
exit();
} else {
// 無 GD 庫:回退輸出預設圖片
$_SESSION['dd_ckstr'] = "abcd";
$_SESSION['dd_ckstr_last'] = '';
header("content-type: image/png\r\n");
header("Pragma: no-cache\r\n");
header("Cache-Control: no-cache\r\n");
header("Expires: 0\r\n");
$fp = fopen("data/vdcode.jpg", "r");
echo fread($fp, filesize("data/vdcode.jpg"));
fclose($fp);
exit();
}
?>
captcha.php。<img src="captcha.php"> 顯示驗證碼。$_SESSION['dd_ckstr'](已轉小寫)與用戶輸入(轉小寫)。此範例可直接整合至專案,或作為客製化驗證碼的基礎模板。