驗證碼是表單防刷、防機器人提交的基礎防線。本文提供一個完整的 CCheckCodeFile 類別,封裝了驗證碼生成、圖片繪製、干擾點繪製、字元渲染與輸出流程,支援自訂圖片寬高、驗證碼位數,適合直接整合至專案中。
OutFileHeader():發送 Content-type: image/png 標頭。CreateCheckCode():以 md5(rand()) 取前 N 碼大寫字元作為驗證碼。CreateImage():建立 GD 圖片資源,填充淺灰背景。SetDisturbColor():繪製 128 個隨機顏色、隨機位置的干擾像素。WriteCheckCodeToImage():逐字元以隨機顏色、隨機 Y 軸位置繪製至圖片。OutCheckImage():串聯上述流程,輸出 PNG 並銷毀資源。class CCheckCodeFile {
private $mCheckCodeNum = 4;
private $mCheckCode = '';
private $mCheckImage = '';
private $mDisturbColor = '';
private $mCheckImageWidth = 80;
private $mCheckImageHeight = 20;
private function OutFileHeader() { header("Content-type: image/png"); }
private function CreateCheckCode() {
$this->mCheckCode = strtoupper(substr(md5(rand()), 0, $this->mCheckCodeNum));
return $this->mCheckCode;
}
private function CreateImage() {
$this->mCheckImage = @imagecreate($this->mCheckImageWidth, $this->mCheckImageHeight);
imagecolorallocate($this->mCheckImage, 200, 200, 200);
return $this->mCheckImage;
}
private function SetDisturbColor() {
for ($i = 0; $i <= 128; $i++) {
$this->mDisturbColor = imagecolorallocate($this->mCheckImage, rand(0,255), rand(0,255), rand(0,255));
imagesetpixel($this->mCheckImage, rand(2,128), rand(2,38), $this->mDisturbColor);
}
}
private function WriteCheckCodeToImage() {
for ($i = 0; $i < $this->mCheckCodeNum; $i++) {
$bg_color = imagecolorallocate($this->mCheckImage, rand(0,255), rand(0,128), rand(0,255));
$x = floor($this->mCheckImageWidth / $this->mCheckCodeNum) * $i;
$y = rand(0, $this->mCheckImageHeight - 15);
imagechar($this->mCheckImage, 5, $x, $y, $this->mCheckCode[$i], $bg_color);
}
}
public function SetCheckImageWH($width, $height) {
if ($width === '' || $height === '') return false;
$this->mCheckImageWidth = $width;
$this->mCheckImageHeight = $height;
return true;
}
public function OutCheckImage() {
$this->OutFileHeader();
$this->CreateCheckCode();
$this->CreateImage();
$this->SetDisturbColor();
$this->WriteCheckCodeToImage();
imagepng($this->mCheckImage);
imagedestroy($this->mCheckImage);
}
}
// 使用方式
$captcha = new CCheckCodeFile();
// $captcha->SetCheckImageWH(100, 50); // 可選:自訂尺寸
$captcha->OutCheckImage();
// 前端驗證時,需將生成的 $captcha->mCheckCode 存入 Session 比對
imagettftext() 載入 TTF 字型,支援中文、斜體、扭曲效果,大幅提升辨識難度。imageline()、imagebezier() 繪製干擾線條。CreateCheckCode() 後將驗證碼寫入 $_SESSION['captcha'],驗證時比對並銷毀。php-gd 擴展並支援 PNG。此類別提供了驗證碼生成的完整骨架,開發者可依專案安全需求逐步強化圖形複雜度與驗證邏輯。