php如何实现验证码
生成验证码图片
使用PHP的GD库创建图像资源,设置背景色和文字颜色。通过imagecreatetruecolor()函数创建画布,imagefill()填充背景,imagettftext()添加随机字符。
$width = 120;
$height = 40;
$image = imagecreatetruecolor($width, $height);
$bgColor = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bgColor);
添加干扰元素
绘制干扰线和噪点增加识别难度。使用imageline()随机生成线条,imagesetpixel()添加单个像素点。
for ($i = 0; $i < 5; $i++) {
$lineColor = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));
imageline($image, rand(0, $width), rand(0, $height), rand(0, $width), rand(0, $height), $lineColor);
}
生成随机字符串
创建包含大小写字母和数字的字符池,通过rand()函数随机选取字符组合成验证码。

$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789';
$code = '';
for ($i = 0; $i < 4; $i++) {
$code .= $chars[rand(0, strlen($chars) - 1)];
}
输出图像并存储验证码
将验证码存入Session供后续验证,使用imagepng()输出图像后销毁资源。
session_start();
$_SESSION['captcha'] = $code;
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
前端调用验证码
在HTML表单中通过img标签动态加载验证码生成脚本,点击图片可刷新验证码。

<img src="captcha.php" onclick="this.src='captcha.php?t='+Math.random()">
<input type="text" name="captcha" required>
验证用户输入
提交表单时比对Session存储的验证码与用户输入,注意处理大小写敏感问题。
session_start();
if ($_POST['captcha'] !== $_SESSION['captcha']) {
die('验证码错误');
}
unset($_SESSION['captcha']);
增强安全性措施
建议实施的额外安全措施:
- 设置验证码有效期(如5分钟过期)
- 限制验证码尝试次数
- 使用更复杂的扭曲变形字体
- 考虑加入数学公式验证等动态验证方式
对于高安全需求场景,可考虑使用第三方验证码服务如reCAPTCHA。






