开发使用验证码的意义就是为了区别操作者是人还是机器,防止自动脚本对服务器造成灾难性的攻击

目前有各种各样的验证码种类,譬如:静态字符验证码、算术验证码、拖拽验证码、识别文字或识别物品验证码(高级),下面介绍随机切换算术或字符验证码

本验证码特点:静态验证码和算术验证码随机更换,每个字符位置会随机移动

一、效果图

二、使用函数列表

  (1)imagecreatetruecolor:创建画布

  (2)imagecolorallocate:为画布分配颜色

  (3)imagefill:画布填充颜色

  (4)imagesetpixel:设置干扰点

  (5)imageline:设置干扰线

  (6)imagestring:水平地画一行字符串

  (7)imagepng:以 png格式将图像输出到浏览器或文件

  (8)imagedestroy:销毁图片

三、实现流程

  创建画布 -> 为画布定义背景颜色 -> 填充背景颜色 -> 设置干扰点 -> 设置干扰线 -> 把字符串填充到画布 -> 设置header向浏览器输出图片 -> 输出图片到浏览器 -> 销毁图片

四、实现代码

    define("WIDTH", 200);
define("HEIGHT", 50);
//1.创建画布
$image = imagecreatetruecolor(WIDTH, HEIGHT); //2.为画布定义背景颜色
$bgcolor = imagecolorallocate($image, 255, 255, 255); //3.填充背景颜色
imagefill($image, 0, 0, $bgcolor); //4.设置干扰点
for ($i = 0; $i < 200; $i++) {
$pointcolor = imagecolorallocate($image, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200));
imagesetpixel($image, mt_rand(0, WIDTH), mt_rand(0, HEIGHT), $pointcolor);
} //5.设置干扰线
for ($i = 0; $i < 3; $i++) {
$linecolor = imagecolorallocate($image, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200));
imageline($image, mt_rand(0, WIDTH), mt_rand(0, HEIGHT), mt_rand(0, WIDTH), mt_rand(0, HEIGHT), $linecolor);
} $type=mt_rand(0,1);
if($type==0){
$num1=mt_rand(0, 99);
$num2=mt_rand(0, 99);
$cal="+-";
$captcha=$num1.$cal[mt_rand(0, strlen($cal)-1)].$num2.'=';
$captchaLen=strlen($captcha);
$distance=WIDTH/2.0/$captchaLen; for ($i = 0; $i < $captchaLen; $i++) {
// 字体颜色
$fontcolor = imagecolorallocate($image, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
// 设置字体内容
$fontcontent = substr($captcha, $i, 1);
// 设置字符的xy坐标
$x = WIDTH/2.0- $distance*$captchaLen/2+$i* $distance;
$y = mt_rand(5, 30);
// 6.把字符串填充到画布
imagestring($image,30, $x, $y, $fontcontent, $fontcolor);
}
}else{
$captcha='2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY';
$captchaLen=4;
$distance=WIDTH/2.0/$captchaLen;
for ($i = 0; $i < $captchaLen; $i++) {
// 字体颜色
$fontcolor = imagecolorallocate($image, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
// 设置字体内容
$fontcontent = $captcha[mt_rand(0, strlen($captcha)-1)];
// 设置字符的xy坐标
$x = WIDTH/2.0- $distance*$captchaLen/2+$i* $distance;
$y = mt_rand(5, 30);
// 6.把字符串填充到画布
imagestring($image,30, $x, $y, $fontcontent, $fontcolor);
}
} //7.向浏览器输出图片头信息
header('content-type:image/png'); //8.输出图片到浏览器
imagepng($image); //9.销毁图片
imagedestroy($image);

php随机类型验证码的更多相关文章

  1. JavaWeb学习记录(五)——Servlet随机产生验证码

    随机产生验证码的工具类: import java.awt.Color;import java.awt.Graphics;import java.awt.image.BufferedImage;impo ...

  2. springboot搭建项目,实现Java生成随机图片验证码。

    这篇文章主要介绍了如何通过Java如何生成验证码并验证.验证码的作用我想必大家都知道,话不多说开始实施! 首先创建一个springboot项目以下是项目结构,内有utli工具类.存放生成图片验证码方法 ...

  3. Python随机生成验证码的两种方法

    Python随机生成验证码的方法有很多,今天给大家列举两种,大家也可以在这个基础上进行改造,设计出适合自己的验证码方法方法一:利用range Python随机生成验证码的方法有很多,今天给大家列举两种 ...

  4. Alias Method解决随机类型概率问题

    举个例子,游戏中玩家推倒了一个boss,会按如下概率掉落物品:10%掉武器 20%掉饰品 30%掉戒指 40%掉披风.现在要给出下一个掉落的物品类型,或者说一个掉落的随机序列,要求符合上述概率. 一般 ...

  5. Android锁定EditText内容和随机生成验证码

    昨天写了个小Demo,实现了随机生成验证码,和锁定EditText两个小功能,先看一下效果图: 锁定EditText在我们不须要用户编辑EditText内容的时候能够用到,实现还是非常easy的,一行 ...

  6. python 全栈开发,Day85(Git补充,随机生成图片验证码)

    昨日内容回顾 第一部分:django相关 1.django请求生命周期 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这 ...

  7. 随机生成验证码及python中的事务

    1.随机生成验证码 # import random # print(random.random()) #-1的小数 # print(random.randint(,)) #包括1和3 # print( ...

  8. 用js做数字字母混合的随机四位验证码

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. js随机生成验证码以及随机颜色

    Javascript通过Math.random()随机生成验证码. 代码如下: <!DOCTYPE html><html> <head> <meta char ...

随机推荐

  1. ssm小小整合

    ssm整合: 首先是创建数据库: CREATE TABLE `user` ( `id` ) NOT NULL, `username` varchar() NOT NULL, `password` va ...

  2. 从零一起学Spring Boot之LayIM项目长成记(一) 初见 Spring Boot

    项目背景 之前写过LayIM的.NET版后端实现,后来又写过一版Java的.当时用的是servlet,websocket和jdbc.虽然时间过去很久了,但是仍有些同学在关注.偶然间我听说了Spring ...

  3. fullCalendar日程管理

    //日程安排 function timeTable(id){ var inner = "<div id='calendar'></div>"; $(&quo ...

  4. TestNG注解使用技巧 - @Factory

    之前在测试中一直使用testNG的@Test注解都很顺利没有碰到什么问题,今天突然遇到@Test不能用的情况,运行后提示: org.testng.TestNGException: Can't invo ...

  5. POJ 3216 Prime Path(打表+bfs)

    Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27132   Accepted: 14861 Desc ...

  6. 利用来JS控制页面控件显示和隐藏有两种方法

    利用来JS控制页面控件显示和隐藏有两种方法,两种方法分别利用HTML的style中的两个属性,两种方法的不同之处在于控件隐藏后是否还在页面上占空位. 方法一:  1 2 document.getEle ...

  7. maven中的坐标和仓库

    1.坐标 pom.xml中的groupId.artifactId和version都可以构成项目的坐标. <dependency>    <groupId></groupI ...

  8. 二、HDFS 架构

    源自:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html HDFS has a m ...

  9. 创建oracle数据库表空间并分配用户

    我们在本地的oracle上或者virtualbox的oracle上 创建新的数据库表空间操作:通过system账号来创建并授权/*--创建表空间create tablespace YUJKDATAda ...

  10. 产品 | What's产品经理

    如果想知道什么是产品,首先需要知道什么是缔造者.其名曰:"产品经理". PS:产品经理一词在国内大多时候泛指"互联网产品经理". 对于产品经理这一职位,说实在很 ...