制作动态随机验证码是一个常见的网站验证码应用,它可以防止恶意攻击和机器批量注册。下面是实现该功能的完整攻略:
1. 生成随机字符串
首先需要生成一个随机的字符串作为验证码。可以使用PHP内置的md5()
函数生成一个32位的随机字符串,也可以通过mt_rand()
、rand()
等随机数函数生成6~10位的随机字符串。
$code = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 6);
上面的代码生成一个6位的随机字符串。其中,str_shuffle()
函数用于打乱字符串的顺序,substr()
函数用于截取指定长度的字符串。
2. 创建画布并输出验证码
接下来需要将该字符串生成一个验证码图片并输出到浏览器。可以使用PHP内置的GD库来创建画布和输出图片。GD库是一个用于处理图片的PHP扩展,可以实现图片的生成、修改和输出等功能。
// 创建画布
$width = 100;
$height = 30;
$image = imagecreatetruecolor($width, $height);
// 设置背景颜色
$bgColor = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bgColor);
// 添加干扰线条
for ($i=0; $i<5; $i++) {
$lineColor = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
imageline($image, mt_rand(0, $width), mt_rand(0, $height), mt_rand(0, $width), mt_rand(0, $height), $lineColor);
}
// 添加干扰点
for ($i=0; $i<50; $i++) {
$pixelColor = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
imagesetpixel($image, mt_rand(0, $width), mt_rand(0, $height), $pixelColor);
}
// 添加验证码字符串
$textColor = imagecolorallocate($image, 0, 0, 0);
$fontSize = 16;
$textX = ($width - $fontSize * 6) / 2;
$textY = ($height - $fontSize) / 2;
imagestring($image, $fontSize, $textX, $textY, $code, $textColor);
// 输出图片
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);
上面的代码创建了一个100x30的画布,并设置了背景色、干扰线条、干扰点和验证码字符串。其中,imagestring()
函数用于将字符串输出到画布上,参数依次为画布、字体大小、字符串位置、字符串内容和颜色。
在浏览器中访问该页面时,将会看到一个随机的验证码图片。
3. 防止恶意攻击
为了避免恶意攻击,需要在验证码表单中添加一个隐藏域,存储服务器端生成的验证码的值,提交表单时验证该值是否与用户输入的验证码一致。
以下是一个验证码表单示例:
<form action="submit.php" method="post">
<label for="captcha">验证码:</label>
<input type="text" id="captcha" name="captcha" autocomplete="off">
<input type="hidden" name="captcha_code" value="<?php echo $code; ?>">
<button type="submit">提交</button>
</form>
在用户提交表单时,需要验证用户输入的验证码值是否与服务器端生成的验证码值一致:
$captcha = $_POST['captcha'];
$captcha_code = $_POST['captcha_code'];
if (strtolower($captcha) == strtolower($captcha_code)) {
// 验证码正确,执行业务逻辑
} else {
// 验证码错误,提示用户重新输入
}
上面的代码中,使用了strtolower()
函数将验证码转换为小写,避免了用户大小写敏感问题。
综上所述,生成动态随机验证码的完整攻略包含了生成随机字符串、创建画布并输出验证码以及防止恶意攻击三个部分。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php制作动态随机验证码 - Python技术站