视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
GD库生成图片验证码
2020-11-03 23:12:11 责编:小采
文档
 对于验证码,我们并不陌生,随处可见,比如:登录注册、论坛灌水、刷票、密码破解等,主要作用是屏蔽机器请求,保障业务不受机器提交请求干扰。

下面就来写一个验证码demo,使用最常见的字母加数字验证码,加上干扰点和干扰线,使用的GD库生成的,如果你没有安装的话,请自行谷歌安装,另如何判断是否安装启用,请直接在phpinfo页面搜GD库即可

效果如下图:

前台页面

<?php
if(isset($_REQUEST["code"])){
 session_start();
 if(strtolower($_POST["code"])==$_SESSION["code"]){
 echo "<script>alert('正确!')</script>";
 }else{
 echo "<script>alert('错误!')</script>";
 }
}
?>
<!doctype html>
<html>
<head>
 <meta charset="UTF-8">
 <meta name="viewport"
 content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>验证码</title>
 <style>
 #code{
 border: 1px solid #ccc;
 vertical-align: bottom;
 }
 #refresh{
 text-decoration: none;
 font-size: .875em;
 }
 </style>
</head>
<body>
<form action="" method="post">
 <p>
 验证码:
 <img src="code.php?r=<?php echo rand()?>" alt="" id="code">
 <a href="javascript:;" id="refresh">看不清?</a>
 </p>
 <p>
 输入验证码:
 <input type="text" name="code">
 </p>
 <input type="submit" value="提交">
 <script>
 document.getElementById("code").onclick = document.getElementById("refresh").onclick = refresh;
 function refresh() {
 document.getElementById('code').src='code.php?r='+Math.random()
 }
 </script>
</form>
</body>
</html>

后台页面

<?php
//启动session
session_start();
$code = ""; //验证码字符串
$str = "qwertyuiopasdfghjklzxcvbnm12345670"; //验证码字符取值范围[a-z0-9]
$w = 160; //图片宽度
$h = 40; //图片高度
$num = 4; //验证码字符数
$dotNum = 300; //干扰点个数
$lineNum = rand(3, 5); //干扰线条数
$font = "./api/DejaVuSansMono.ttf"; //设置字体文件
$image = imagecreatetruecolor($w, $h); //创建一张指定宽高的图片
$imageColor = imagecolorallocate($image, 255, 255, 255); //设置背景图片颜色为白色
imagefill($image, 0, 0, $imageColor); //填充图片背景
//随机验证码,包含字母和数字
for ($i = 0; $i < $num; $i++) {
 $fontColor = imagecolorallocate($image, rand(0, 120), rand(0, 120), rand(0, 120)); //生成随机字体颜色
 $content = substr($str, rand(0, strlen($str)), 1); //随机取字符集中的值
 $code .= $content;
 $fontSize = rand(15, 25); //字体大小
 $x = $i * $w / $num + rand(5, 10); //指定生成位置X轴偏移量
 $y = rand(20, 30); //指定生成位置Y轴偏移量
 imagettftext($image, $fontSize, 0, $x, $y, $fontColor, $font, $content);
}
$_SESSION["code"] = $code; //保存验证码字符串到session中
//生成干扰点
for ($i = 0; $i < $dotNum; $i++) {
 $dotColor = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));
 imagesetpixel($image, rand(0, $w), rand(0, $h), $dotColor);
}
//生成干扰线
for ($i = 0; $i < $lineNum; $i++) {
 $lineColor = imagecolorallocate($image, rand(0, 100), rand(0, 100), rand(0, 100));
 imageline($image, rand(0, $w), rand(0, $h), rand(0, $w), rand(0, $h), $lineColor);
}
header("content-type:image/png");
imagepng($image);
imagedestroy($image);

下载本文
显示全文
专题