Home >Backend Development >PHP Tutorial >每日一搏 | php 绘制图片验证码

每日一搏 | php 绘制图片验证码

WBOY
WBOYOriginal
2016-06-20 12:32:02794browse

验证码是一种安全保护机制,在注册时要求必须有人工操作进行验证,用于防止垃圾注册机大量注册用户账号占用服务器内存从而使服务器瘫痪。

图片验证码的实现十分简单。首先从指定字符集合中随机抽取固定数目的字符,以一种不规则的方法画在画布上,再适当添加一些干扰点和干扰元素,最后将图片输出,一张崭新的验证码就完成了。

前端代码如下:

<!DOCTYPE html><html><head>    <meta http-equiv="content-type" content="text/html;charset=utf-8">    <title>This is a test!</title>    <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"></head><body>    <form name="form">        <input type="text" placeholder="账号"/><br/>        <input type="password" placeholder="密码"/><br/>        <input type="text" placeholder="验证码"/>        <img  id="verImg" src="libs/verification.php"/ alt="每日一搏 | php 绘制图片验证码" >        <a href="#" class="change" onclick="changeVer()">点击刷新</a><br/>        <input type="submit" value="登录"/>    </form>    <script type="text/javascript">    //刷新验证码    function changeVer(){        document.getElementById("verImg").src="libs/verification.php?tmp="+Math.random();    }    </script></body></html>

php脚本文件验证码的代码如下:

<?phpsession_start();//开启session记录验证码数据vCode(4, 15);//设置验证码的字符个数和图片基础宽度//vCode 字符数目,字体大小,图片宽度、高度function vCode($num = 4, $size = 20, $width = 0, $height = 0) {    !$width && $width = $num * $size * 4 / 5 + 15;    !$height && $height = $size + 10;    //设置验证码字符集合    $str = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVW";    //保存获取的验证码    $code = '';    //随机选取字符    for ($i = 0; $i < $num; $i++) {        $code .= $str[mt_rand(0, strlen($str)-1)];    }    //创建验证码画布    $im = imagecreatetruecolor($width, $height);    //背景色    $back_color = imagecolorallocate($im, mt_rand(0,100),mt_rand(0,100), mt_rand(0,100));    //文本色    $text_color = imagecolorallocate($im, mt_rand(100, 255), mt_rand(100, 255), mt_rand(100, 255));    imagefilledrectangle($im, 0, 0, $width, $height, $back_color);     // 画干扰线    for($i = 0;$i < 5;$i++) {        $font_color = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));        imagearc($im, mt_rand(- $width, $width), mt_rand(- $height, $height), mt_rand(30, $width * 2), mt_rand(20, $height * 2), mt_rand(0, 360), mt_rand(0, 360), $font_color);    }     // 画干扰点    for($i = 0;$i < 50;$i++) {        $font_color = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));        imagesetpixel($im, mt_rand(0, $width), mt_rand(0, $height), $font_color);    }    //随机旋转角度数组    $array=array(5,4,3,2,1,0,-1,-2,-3,-4,-5);     // 输出验证码    // imagefttext(image, size, angle, x, y, color, fontfile, text)    @imagefttext($im, $size , array_rand($array), 12, $size + 6, $text_color, 'c:\WINDOWS\Fonts\simsun.ttc', $code);    $_SESSION["VerifyCode"]=$code;    //no-cache在每次请求时都会访问服务器    //max-age在请求1s后再次请求会再次访问服务器,must-revalidate则第一发送请求会访问服务器,之后不会再访问服务器    // header("Cache-Control: max-age=1, s-maxage=1, no-cache, must-revalidate");    header("Cache-Control: no-cache");    header("Content-type: image/png;charset=gb2312");    //将图片转化为png格式    imagepng($im);    imagedestroy($im);}?>

最后看一下生成的验证码:

点击刷新:

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn