php实现图片验证码
生成随机验证码字符串
使用PHP的rand()或mt_rand()函数生成随机数,并通过字符串拼接形成验证码。常见做法是混合数字和字母:
$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
$code = substr(str_shuffle($chars), 0, 4);
创建画布并设置背景
使用imagecreatetruecolor()创建指定大小的画布,建议尺寸为80x30像素。通过imagecolorallocate()设置背景色和文本颜色:
$width = 80;
$height = 30;
$im = imagecreatetruecolor($width, $height);
$bg = imagecolorallocate($im, 240, 240, 240);
imagefill($im, 0, 0, $bg);
添加干扰元素
为增强安全性,可添加干扰线和噪点。使用imageline()绘制随机线段,imagesetpixel()添加随机像素点:
for ($i = 0; $i < 5; $i++) {
$color = imagecolorallocate($im, rand(0, 255), rand(0, 255), rand(0, 255));
imageline($im, rand(0, $width), rand(0, $height), rand(0, $width), rand(0, $height), $color);
}
绘制验证码文本
使用imagestring()或imagettftext()(需字体文件)将验证码文本绘制到画布。建议随机旋转字符角度并分散位置:
for ($i = 0; $i < strlen($code); $i++) {
$color = imagecolorallocate($im, rand(0, 120), rand(0, 120), rand(0, 120));
$angle = rand(-15, 15);
imagettftext($im, 16, $angle, 15 + $i * 15, 25, $color, 'path/to/font.ttf', $code[$i]);
}
输出并销毁图像
设置HTTP头为图像类型后输出,最后销毁图像资源释放内存:
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
会话存储验证码
将生成的验证码存入$_SESSION供后续验证使用:
session_start();
$_SESSION['captcha'] = $code;
完整示例代码
session_start();
$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
$code = substr(str_shuffle($chars), 0, 4);
$width = 80;
$height = 30;
$im = imagecreatetruecolor($width, $height);
$bg = imagecolorallocate($im, 240, 240, 240);
imagefill($im, 0, 0, $bg);
for ($i = 0; $i < 5; $i++) {
$color = imagecolorallocate($im, rand(0, 255), rand(0, 255), rand(0, 255));
imageline($im, rand(0, $width), rand(0, $height), rand(0, $width), rand(0, $height), $color);
}
for ($i = 0; $i < strlen($code); $i++) {
$color = imagecolorallocate($im, rand(0, 120), rand(0, 120), rand(0, 120));
imagestring($im, 5, 5 + $i * 20, 5, $code[$i], $color);
}
$_SESSION['captcha'] = $code;
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
验证码校验方法
在表单提交处理页面对比用户输入与session存储的值:
session_start();
if ($_POST['captcha'] !== $_SESSION['captcha']) {
die('验证码错误');
}






