文档章节

php绘制图片验证码

lonelydawn
 lonelydawn
发布于 2016/04/12 00:20
字数 666
阅读 3039
收藏 137
点赞 18
评论 16

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

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

前端代码如下:

<!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"/>
        <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脚本文件验证码的代码如下:

<?php

session_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);
}
?>


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

点击刷新:



© 著作权归作者所有

共有 人打赏支持
lonelydawn
粉丝 41
博文 50
码字总数 52905
作品 0
闵行
前端工程师
加载中

评论(16)

h
hostyep
matk
blackjune
blackjune
http://php.net/manual/zh/function.array-rand.php
blackjune
blackjune
还是要多看文档啊
长宁楚王陈涉
长宁楚王陈涉

引用来自“洛阳码农”的评论

eechen快来啊

引用来自“一色秋”的评论

又想引战?PHP是可读性最差的编程语言,没有之一
不懂的人永远觉得麻烦,
金三胖
金三胖
你这验证码太好破解了
黑觉非常君
黑觉非常君

引用来自“洛阳码农”的评论

eechen快来啊
又想引战?PHP是可读性最差的编程语言,没有之一
红白机
红白机
谷歌那个码都被破了,这个应该也很容易破吧?
Hsianglee
Hsianglee
收藏[13]
Loveni
Loveni
未完成
YANG_YAWEI
YANG_YAWEI
点赞,我写的那个没有加上 Cache-Control 这个头
PHP 画图应用 验证码 柱状图

Title: PHP 画图应用 验证码 柱状图 Author: MoreWindows Blog: http://blog.csdn.net/MoreWindows KeyWord: PHP 验证码 柱状图 imagefilledarc 阅读本文之前,推荐先参阅姊妹篇《PHP 画图基...

彭博 ⋅ 2012/04/12 ⋅ 0

PHP 画图应用 验证码 柱状图

Title: PHP 画图应用 验证码 柱状图 Author: MoreWindows Blog: http://blog.csdn.net/MoreWindows KeyWord: PHP 验证码 柱状图 imagefilledarc 阅读本文之前,推荐先参阅姊妹篇《PHP 画图基...

长平狐 ⋅ 2012/12/10 ⋅ 0

小博老师解析Java核心技术点-验证码制作

[理论知识] 在java程序开发中,要显示一张图片,主要有两种方式。第一种是基于现成图片,这种方式比较常见也比较简单。第二种是使用java中java.awt包和com.sun.image包中的绘图技术,使用代码...

博为峰教研组 ⋅ 2016/11/02 ⋅ 0

Minho/php-captcha

php-captcha 简单的php验证码库。 PHP生成验证码图片 PHP生成验证码的原理:使用PHP的GD库,生成一张带验证码的图片,并将验证码保存在Session中。PHP生成验证码的大致流程有: 1、产生一张p...

Minho ⋅ 2017/01/15 ⋅ 0

【代码实现】PHP生成各种随机验证码

文章来源:PHP开发学习门户 (自行开发的个人网站) 验证码在WEB应用中非常重要,通常用来防止用户恶意提交表单,如恶意注册和登录、论坛恶意灌水等。本文将通过实例讲解使用PHP生成各种常见...

PHP开发学习门户 ⋅ 2014/10/07 ⋅ 0

Resin 验证码图片无法显示

原本在tomcat jetty上正常显示的验证码,在resin上无法正常显示。验证码用img tag引用jsp绘制数字图片的方式得到的,是网上常见的验证码生成方式。查看网络http请求情况,发现请求响应状态2...

厦门王五 ⋅ 2014/06/12 ⋅ 0

用C#的GDI+技术生成复杂型彩色验证码

该类是生成一个验证码的类。本人集合了网上大部分的C#关于GDI+的文章进行多次改进,现在已经形成了可在生产环节中使用的验证码。 该验证码加入了背景噪点,背景噪点曲线和直线,背景噪点文字...

Minho ⋅ 2012/12/13 ⋅ 2

JavaWeb中验证码的实现

在Web程序中,验证码是经常使用的技术之一。Web程序永远面临未知用户和未知程序的探测。为了防止恶意脚本的执行,验证码技术无疑是首选方案之一。本文将讨论如何在JSP和Servlet中使用验证码技...

zretc ⋅ 2013/06/09 ⋅ 0

Zend的Captcha机制

如何生成验证码图片?使用php的GD? ok,right。其实Zend的Captcha模块已经封装好了。这篇文章就说一下如何使用Zend的Captcha模块。 环境安装 首先Zend的Captcha需要安装GD。查看有没有安装G...

王二狗子11 ⋅ 01/08 ⋅ 0

PHP制作数字、字母型验证码及其工作原理剖析

准备: 使用PHP生成验证码图片,需要PHP的GD模块,GD扩展库用于处理图像。所以先去检查你的服务器使用的PHP版本是否开启GD模块,你可以使用PHP内置函数phpinfo()去检查,至于如何去做就不在这...

小飞侠_Kobe ⋅ 2016/09/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

apollo配置中心的学习笔记

公司现在配置文件太多了,导致配置文件修改起来还是非常麻烦的。在boss(业务运营支撑系统)中,配置文件是存放在jar包的,通过应用jar包来引用配置文件(区分不同环境)。这种方式虽然能够满足...

miaojiangmin ⋅ 5分钟前 ⋅ 0

Jena增删改查AP

插入、更新数据 public static void insert(){ String query = "PREFIX book: <http://www.book.com/jinyong/> \n" + " INSERT DATA \n" + ......

Vincent-Duan ⋅ 5分钟前 ⋅ 0

springMVC之与json数据交互方法

因为我也要返回json数据。所以需要这个注解@ResponseBody,把Java对象转换成json字符串 注意: 1、@RequestBody不能省,因为前台发过来的数据是json数据,得用这个注解去解析该怎么接收这些数...

颖伙虫 ⋅ 9分钟前 ⋅ 0

用实例域代替序号(31)

1、许多枚举天生就与一个单独的int 值相关联 ordinal 方法,返回枚举常量在类型中的数字位置 下述,枚举修改很不方便,不好维护 永远不要根据枚举的序数导出与他相关联的值 而是将他保存在一...

职业搬砖20年 ⋅ 11分钟前 ⋅ 0

并发编程---ConcurrentHashMap源码解析

ConcurrentHashMap是java中为了解决HashMap不能支持高并发而设计的新的实现。 ConcurrentHashMap的类结构 public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements C......

千古一梦888 ⋅ 14分钟前 ⋅ 0

微服务 WildFly Swarm 简介

我们将看到的最后一个Java微服务框架是一个相对较新的场景,它利用了 JBoss WildFly 应用服务器中已试过且受信任的 JavaEE 功能。WildFly Swarm 是 WildFly 应用服务器的一个完整的拆下来的组...

woshixin ⋅ 19分钟前 ⋅ 0

android apk 瘦身

头条APK瘦身之路 随着版本迭代,功能增加安装包体积也会慢慢增大。 今日头条576版本APK达到了25M,通过一系列的优化,到目前的607版本为12M。本文主要是介绍头条APK瘦身中用到的一些方法。 ...

GoldenVein ⋅ 23分钟前 ⋅ 1

mac机器学习开发环境部署及helloworld

一、下载并安装Anaconda2.7 https://repo.anaconda.com/archive/Anaconda2-5.2.0-MacOSX-x86_64.pkg 路径:/Users/shijun/anaconda2 二、运行Anaconda Navigator -> Environments -> base(ro......

八戒八戒八戒 ⋅ 34分钟前 ⋅ 0

关于日常开发的经验总结(Java),持续更新中

常量尽量使用枚举来表示,这样表现力会很强,因为枚举比一个常量类要有更多的扩展性 方法的入参和出参尽量不要使用Map,因为Map会让调用者感到迷惑,他不知道你里面装的什么,面向对象的开发...

小99 ⋅ 34分钟前 ⋅ 0

IDEA创建SpringMVC+Mybatis+Maven项目

视频如下(加载有点慢请见谅,服务器不太好): 视频

影狼 ⋅ 35分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部