php实现验证码
验证码在表单实现越来越多了,但是用js的写的验证码,总觉得不方便,所以学习了下php实现的验证码。好吧,其实是没有事情干,但是又不想浪费时间,所以学习了下php实现验证码。正所谓,技多不压身。而且,也可以封装成一个函数,以后使用的时候也是很方便的,当然现在未封装。
现在来说说简单的纯数字验证码吧。
如果是初学者,建议按照我代码的注释 //数字 一步步来。最简单的方法,还是把整个代码复制走了。
新建一个captcha.php:

- php
- //10>设置session,必须处于脚本最顶部
- session_start();
- $image = imagecreatetruecolor(100, 30); //1>设置验证码图片大小的函数
- //5>设置验证码颜色 imagecolorallocate(int im, int red, int green, int blue);
- $bgcolor = imagecolorallocate($image,255,255,255); //#ffffff
- //6>区域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的区域着色,col 表示欲涂上的颜色
- imagefill($image, 0, 0, $bgcolor);
- //10>设置变量
- $captcha_code = "";
- //7>生成随机数字
- for($i=0;$i<4;$i++){
- //设置字体大小
- $fontsize = 6;
- //设置字体颜色,随机颜色
- $fontcolor = imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120)); //0-120深颜色
- //设置数字
- $fontcontent = rand(0,9);
- //10>.=连续定义变量
- $captcha_code .= $fontcontent;
- //设置坐标
- $x = ($i*100/4)+rand(5,10);
- $y = rand(5,10);
- imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
- }
- //10>存到session
- $_SESSION['authcode'] = $captcha_code;
- //8>增加干扰元素,设置雪花点
- for($i=0;$i<200;$i++){
- //设置点的颜色,50-200颜色比数字浅,不干扰阅读
- $pointcolor = imagecolorallocate($image,rand(50,200), rand(50,200), rand(50,200));
- //imagesetpixel — 画一个单一像素
- imagesetpixel($image, rand(1,99), rand(1,29), $pointcolor);
- }
- //9>增加干扰元素,设置横线
- for($i=0;$i<4;$i++){
- //设置线的颜色
- $linecolor = imagecolorallocate($image,rand(80,220), rand(80,220),rand(80,220));
- //设置线,两点一线
- imageline($image,rand(1,99), rand(1,29),rand(1,99), rand(1,29),$linecolor);
- }
- //2>设置头部,image/png
- header('Content-Type: image/png');
- //3>imagepng() 建立png图形函数
- imagepng($image);
- //4>imagedestroy() 结束图形函数 销毁$image
- imagedestroy($image);

接着就是静态页的代码了:index.html

- <!doctype html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>确认验证码title>
- </head>
- <body>
- <form method="post" action="./form.php">
- <p>验证码: <img id="captcha_img" border='1' src='./captcha.php?r=echo rand(); ?>' style="width:100px; height:30px" />
- <a href="javascript:void(0)" onclick="document.getElementById('captcha_img').src='./captcha.php?r='+Math.random()">换一个</a>
- </p>
- <P>请输入验证码:<input type="text" name='authcode' value=''/></p>
- <p><input type='submit' value='提交' style='padding:6px 5px;'/></p>
- </body>
- </html>

从index.html可以看到,提交的表单是到form.php的,所以还要有一个判断的form.php代码:

- php
- header("Content-Type:text/html;charset=utf-8"); //设置头部信息
- //isset()检测变量是否设置
- if(isset($_REQUEST['authcode'])){
- session_start();
- //strtolower()小写函数
- if(strtolower($_REQUEST['authcode'])== $_SESSION['authcode']){
- //跳转页面
- echo "<script language=\"javascript\">";
- echo "document.location=\"./form.php\"";
- echo "</script>";
- }else{
- //提示以及跳转页面
- echo "<script language=\"javascript\">";
- echo "alert('输入错误!');";
- echo "document.location=\"./form.php\"";
- echo "</script>";
- }
- exit();
- }

显示页面如下:
那么,纯数字的实现了,数字加英文的也应该不难了。要修改的代码 只是在 captcha.php 将 //7>生成随机数字 修改成 //7>生成随机的字母和数字,如果你真的很可爱的就修改这几个字就认为可以实现的话,那么祝贺你,你永远保持快乐。脑残儿童欢乐多。
废话不多说了,拉代码吧。

- php
- //10>设置session,必须处于脚本最顶部
- session_start();
- $image = imagecreatetruecolor(100, 30); //1>设置验证码图片大小的函数
- //5>设置验证码颜色 imagecolorallocate(int im, int red, int green, int blue);
- $bgcolor = imagecolorallocate($image,255,255,255); //#ffffff
- //6>区域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的区域着色,col 表示欲涂上的颜色
- imagefill($image, 0, 0, $bgcolor);
- //10>设置变量
- $captcha_code = "";
- //7>生成随机的字母和数字
- for($i=0;$i<4;$i++){
- //设置字体大小
- $fontsize = 8;
- //设置字体颜色,随机颜色
- $fontcolor = imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120)); //0-120深颜色
- //设置需要随机取的值,去掉容易出错的值如0和o
- $data ='abcdefghigkmnpqrstuvwxy3456789';
- //取出值,字符串截取方法 strlen获取字符串长度
- $fontcontent = substr($data, rand(0,strlen($data)),1);
- //10>.=连续定义变量
- $captcha_code .= $fontcontent;
- //设置坐标
- $x = ($i*100/4)+rand(5,10);
- $y = rand(5,10);
- imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
- }
- //10>存到session
- $_SESSION['authcode'] = $captcha_code;
- //8>增加干扰元素,设置雪花点
- for($i=0;$i<200;$i++){
- //设置点的颜色,50-200颜色比数字浅,不干扰阅读
- $pointcolor = imagecolorallocate($image,rand(50,200), rand(50,200), rand(50,200));
- //imagesetpixel — 画一个单一像素
- imagesetpixel($image, rand(1,99), rand(1,29), $pointcolor);
- }
- //9>增加干扰元素,设置横线
- for($i=0;$i<4;$i++){
- //设置线的颜色
- $linecolor = imagecolorallocate($image,rand(80,220), rand(80,220),rand(80,220));
- //设置线,两点一线
- imageline($image,rand(1,99), rand(1,29),rand(1,99), rand(1,29),$linecolor);
- }
- //2>设置头部,image/png
- header('Content-Type: image/png');
- //3>imagepng() 建立png图形函数
- imagepng($image);
- //4>imagedestroy() 结束图形函数 销毁$image
- imagedestroy($image);

其他的两个页面,不许要修改。
一般而言,现在就已经够用了。但是就像动漫一样,总会有番外。
那么,我们来个汉字的番外吧。其实我也准备将汉字的验证码放到我的毕业设计里面,虽然现在很流行滑动验证码,但是本人毕竟不是专门学习js的。
而且,还可以和答辩的老师说,我们验证码不需要素材,连图片也是生成的,用自己的知识装13,也没有设么的。

- php
- //11>设置session,必须处于脚本最顶部
- session_start();
- //1>设置验证码图片大小的函数
- $image = imagecreatetruecolor(200, 60);
- //5>设置验证码颜色 imagecolorallocate(int im, int red, int green, int blue);
- $bgcolor = imagecolorallocate($image,255,255,255); //#ffffff
- //6>区域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的区域着色,col 表示欲涂上的颜色
- imagefill($image, 0, 0, $bgcolor);
- //7>设置ttf字体
- $fontface = 'FZYTK.TTF';
- //7>设置字库,实现简单的数字储备
- $str='天地不仁以万物为刍狗圣人不仁以百姓为刍狗这句经常出现在控诉暴君暴政上地残暴不仁把万物都当成低贱的猪狗来看待而那些高高在上的所谓圣人们也没两样还不是把我们老百姓也当成猪狗不如的东西但实在正取的解读是地不情感用事对万物一视同仁圣人不情感用事对百姓一视同仁执子之手与子偕老当男女主人公含情脉脉看着对方说了句执子之手与子偕老女方泪眼朦胧含羞地回一句讨厌啦这样的情节我们是不是见过很多但是我们来看看这句的原句死生契阔与子成说执子之手与子偕老于嗟阔兮不我活兮于嗟洵兮不我信兮意思是说战士之间的约定说要一起死现在和我约定的人都走了我怎么活啊赤裸裸的兄弟江湖战友友谊啊形容好基友的基情比男女之间的爱情要合适很多吧';
- //str_split()切割字符串为一个数组,一个中文在utf_8为3个字符
- $strdb = str_split($str,3);
- //>11
- $captcha_code = '';
- //8>生成随机的汉子
- for($i=0;$i<4;$i++){
- //设置字体颜色,随机颜色
- $fontcolor = imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120)); //0-120深颜色
- //随机选取中文
- $in = rand(0,count($strdb));
- $cn = $strdb[$in];
- //将中文记录到将保存到session的字符串中
- $captcha_code .= $cn;
- /*imagettftext (resource $image ,float $size ,float $angle ,int $x ,int $y,int $color,
- string $fontfile ,string $text ) 幕布 ,尺寸,角度,坐标,颜色,字体路径,文本字符串
- mt_rand()生成更好的随机数,比rand()快四倍*/
- imagettftext($image, mt_rand(20,24),mt_rand(-60,60),(40*$i+20),mt_rand(30,35),$fontcolor,$fontface,$cn);
- }
- //11>存到session
- $_SESSION['authcode'] = $captcha_code;
- //9>增加干扰元素,设置点
- for($i=0;$i<200;$i++){
- //设置点的颜色,50-200颜色比数字浅,不干扰阅读
- $pointcolor = imagecolorallocate($image,rand(50,200), rand(50,200), rand(50,200));
- //imagesetpixel — 画一个单一像素
- imagesetpixel($image, rand(1,199), rand(1,59), $pointcolor);
- }
- //10>增加干扰元素,设置线
- for($i=0;$i<4;$i++){
- //设置线的颜色
- $linecolor = imagecolorallocate($image,rand(80,220), rand(80,220),rand(80,220));
- //设置线,两点一线
- imageline($image,rand(1,199), rand(1,59),rand(1,199), rand(1,59),$linecolor);
- }
- //2>设置头部,image/png
- header('Content-Type: image/png');
- //3>imagepng() 建立png图形函数
- imagepng($image);
- //4>imagedestroy() 结束图形函数 销毁$image
- imagedestroy($image);

其他的页面也是不需要修改的。
效果图如下:
php实现验证码的更多相关文章
- .net点选验证码实现思路分享
哈哈好久没冒泡了,最进看见点选验证码有点意思,所以想自己写一个. 先上效果图 如果你被这个效果吸引了就请继续看下去. 贴代码前先说点思路: 1.要有一个汉字库,并按字形分类.(我在数据库里是安部首分类 ...
- 【探索】无形验证码 —— PoW 算力验证
先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...
- TODO:Laravel增加验证码
TODO:Laravel增加验证码1. 先聊聊验证码是什么,有什么作用?验证码(CAPTCHA)是"Completely Automated Public Turing test to te ...
- PHP-解析验证码类--学习笔记
1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1 定义变量 //随机因子 private $char ...
- 随手记_C#验证码
前言 最近在网上偶然看见一个验证码,觉得很有意思,于是搜了下,是使用第三方实现的,先看效果: 总体来说效果还是可以的,官方提供的SDK也比较详细,可配置性很高.在这里在简单啰嗦几句使用方式: 使用步骤 ...
- WPF做12306验证码点击效果
一.效果 和12306是一样的,运行一张图上点击多个位置,横线以上和左边框还有有边框位置不允许点击,点击按钮输出坐标集合,也就是12306登陆的时候,需要向后台传递的参数. 二.实现思路 1.获取验证 ...
- 零OCR基础6行代码实现C#验证码识别
这两天因为工作需要,要到某个网站采集信息,一是要模拟登陆,二是要破解验证码,本想用第三方付费打码,但是想想网上免费的代码也挺多的,于是乎准备从网上撸点代码下来,谁知道,撸了好多个都不行,本人以前也没接 ...
- ASP.NET中画图形验证码
context.Response.ContentType = "image/jpeg"; //生成随机的中文验证码 string yzm = "人口手大小多少上中下男女天 ...
- asp.net mvc 验证码
效果图 验证码类 namespace QJW.VerifyCode { //用法: //public FileContentResult CreateValidate() //{ // Validat ...
- ecshop验证码
<?php //仿制ecshop验证码(四位大写字母和数字.背景) //处理码值(四位大写字母和数字组成) //所有的可能的字符集合 $chars = 'ABCDEFGHIJKLMNOPQRST ...
随机推荐
- java中数据类型转换
1.自动类型转换:首先两者数据类型要兼容,且目标类型要大于源类型如(int类型转换成double类型) 2.强制转换:两者数据类型要兼容,会使破坏数据的结构
- 关于listview的一些属性
由于这两天在做listView的东西,所以整理出来一些我个人认为比较特别的属性,通过设置这样的属性可以做出更加美观的列表 首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你 ...
- Thinkpad 笔记本VMware Workstation 安装虚拟机出现“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”解决方法
今天在使用VMware打算在机器中安装新的虚拟机时,出现"此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态"错误如下: 提示信息: 已将该虚拟机配 ...
- [翻译]用神经网络做回归(Using Neural Networks With Regression)
本文英文原文出自这里, 这个博客里面的内容是Java开源, 分布式深度学习项目deeplearning4j的介绍学习文档. 简介: 一般来说, 神经网络常被用来做无监督学习, 分类, 以及回归. 也就 ...
- 【MySQL】MySQL 5.7+ 版本的初始化
MySQL 5.7.7以上二进制包就不包括原data目录的初始化系统表,官网说明: http://dev.mysql.com/doc/refman/5.7/en/data-directory-init ...
- java学习第四天
那些逻辑语言就基本了解下,今天想到了一个问题就是关于for和while的区别,从专业上来说,for和while基本上是相同的,但是for是只允许一次访问的,如果结束后就无法继续访问,而while则可以 ...
- nuint笔记
注意:单元测试中,Case 与 Case 之间不能有任何关系 测试方法不能有返回值,不能有参数,测试方法必须声明为 public [TestFixture] //声明测试类 [SetUp] //建立, ...
- 一致性hash介绍
像Memcache以及其它一些内存K/V数据库一样,Redis本身不提供分布式支持,所以在部署多台Redis服务器时,就需要解决如何把数据分散到各个服务器的问题,并且在服务器数量变化时,能做到最大程度 ...
- CentOS 问题集锦
在CentOS 6更新后,不可避免的会在启动选项中产生多个内核选项,一个内核文件大概占100兆左右(一般100M以下),可以使用以下命令进行删除多余的内核. 1.首先列出系统中正在使用的内核: # u ...
- jquery的扩展之extend函数
1.$.extend()使用 作用:扩展全局的函数 $.extend({ sayHellow:function(pram){ alert(pram+"hellow"); } }) ...