[转]php 图片验证码生成 前后台验证
本文转自:https://www.cnblogs.com/xiaoyezi/p/3541195.html
自己从前一段时间做了个php小项目,关于生成图片验证码生成和后台的验证,把自己用到的东西总结一下,希望大家在用到相关问题的时候可以有一定的参考性。
首先,php验证码生成。
代码如下:
1.生成图像代码(picture.php)

<?php
header("Cache-Control: no-cache, must-revalidate");
// 声明图像大小
$img_height=70;
$img_width=25;
$authnum='';
// 验证码内容
$ychar="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
$list=explode(",",$ychar);
for($i=0;$i<4;$i++){
$randnum=rand(0,35);
$authnum.=$list[$randnum];
} // 生成一个基本大小图像
$aimg = imagecreate($img_height,$img_width);
// 图像填充颜色
imagecolorallocate($aimg, 255,255,255);
$black = imagecolorallocate($aimg, 0,0,0); for ($i=1; $i<=100; $i++) { imagestring($aimg,1,mt_rand(1,$img_height),mt_rand(1,$img_width),"@",imagecolorallocate($aimg,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));
} //为了区别于背景,这里的颜色不超过200,上面的不小于200
for ($i=0;$i<strlen($authnum);$i++){
imagestring($aimg, mt_rand(3,5),$i*$img_height/4+mt_rand(2,7),mt_rand(1,$img_width/2-2), $authnum[$i],imagecolorallocate($aimg,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200)));
}
imagerectangle($aimg,0,0,$img_height-1,$img_width-1,$black);//画一个矩形
Header("Content-type: image/PNG");
ImagePNG($aimg); //生成png格式
ImageDestroy($aimg);
?>

2.利用一个form表单(名称为index.php)调用上面的picture.php
为了便于演示,以下所说的所有文件放在相同的目录。
--folder1--picture.php
--index.php
|
1
2
3
4
5
6
|
<form> <div> <img id="codeP" src="picture.php"/> <input id="codeT" type="text" name="codeT" /> </div></form> |
当你完成上面的代码时候你就应该能看到在页面中加载了图片的验证码。
如果你的图片没有加载成功的话,检查文件路径或者php.ini中[extension=php_gd2.dll]这个代码是否放开了。
其次,当你完成了图片的显示,你又将要遇到另外一个问题,验证码的刷新。
相信只要是稍微理解一点js用法的人都应该想的到,给某个空间加上一个onclick事件,工作就迎刃而解了。为了方便,我将修改上面index.php的代码。
|
1
2
3
4
5
6
7
8
9
10
11
|
<script type="text/javascript">function refresh() { document.getElementById("codeP").src = "picture.php?tm="+Math.random();}</script><form> <div> <img id="codeP" src="picture.php" onclick="refresh()"/> <input id="codeT" type="text" name="codeT" /> </div></form> |
当你将上述代码修改结束时,你就会发现,当你点击图片的时候,验证码就自己变了。至于说蓝色字体的tm=***:代表每次生成随机码,也就是不取缓存。
再次,当你将上面两个步骤完成之后,当你提交表单的时候,你就应该去验证你输入的验证码和图片验证码是否一致,有以下几种方法:
1.客户端验证(cookie验证,不推荐)不安全
2.服务器端验证(session,推荐)安全
关于为什么安全,为什么不安全,网上有很多帖子,可以一一膜拜,这里不细说。
下面的例子就说一下服务器端验证的代码。
在提到验证代码之前,我要先把前面提到的picture.php修正一下,以得到验证效果,着重看新添加的代码和注释。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<?php// session有效session_start();// 声明一个sessoinsession_register("sessionCode");header("Cache-Control: no-cache, must-revalidate");// 声明图像大小$img_height=70;$img_width=25;$authnum='';// 验证码内容$ychar="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";$list=explode(",",$ychar);for($i=0;$i<4;$i++){ $randnum=rand(0,35); $authnum.=$list[$randnum];}// 将每次生成的验证码保存在session中$_SESSION["sessionCode"] = $authnum;// 生成一个基本大小图像$aimg = imagecreate($img_height,$img_width);// 图像填充颜色imagecolorallocate($aimg, 255,255,255);$black = imagecolorallocate($aimg, 0,0,0);for ($i=1; $i<=100; $i++) { imagestring($aimg,1,mt_rand(1,$img_height),mt_rand(1,$img_width),"@",imagecolorallocate($aimg,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));}//为了区别于背景,这里的颜色不超过200,上面的不小于200for ($i=0;$i<strlen($authnum);$i++){ imagestring($aimg, mt_rand(3,5),$i*$img_height/4+mt_rand(2,7),mt_rand(1,$img_width/2-2), $authnum[$i],imagecolorallocate($aimg,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200)));}imagerectangle($aimg,0,0,$img_height-1,$img_width-1,$black);//画一个矩形Header("Content-type: image/PNG");ImagePNG($aimg); //生成png格式ImageDestroy($aimg);?> |
图片验证的方式有两种:
1.后台验证,在你提交的页面中取得你填写的验证码和session中的验证码是否一致,在做相关操作。
后台验证比较简单,直接贴一下代码。(假如的form表单中要提交的checked.php)
|
1
2
3
4
5
6
7
8
9
|
<?phpsession_start();$codeT = $_POST['codeT '];$codeP = $_SESSION["sessionCode"];if ($codeT==$codeP) { 做你想要做的操作;} else { 验证码有误;<br> 相关操作;} |
2.前台验证:
如果你想在前台直接取得$_SESSION["sessionCode"]的值得话,你就大错特错了。
因为你取的值肯定实在html中隐藏起来的,但是图片实在所有html元素加载之后才加载图片的(也就是俗话说的异步加载)
所以做check的时候可以采用异步验证+提交。也就是异步验证过了之后,我在提交表单。我简单的吧代码贴在下面。
index.php
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
<script type="text/javascript">function sub() { ajaxSubmit(test,"submitTag.php");}function ajaxSubmit(formName,submitURL) { var code = document.getElementById('codeT').value; var postStr = "test="+code; var xmlHttp = false; if(window.ActiveXObject){ xmlHttp = new ActiveXObject("Microsoft.XmlHttp"); } else if(window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest(); } xmlHttp.onreadystatechange = function(){ if(xmlHttp.readyState==4){ if(xmlHttp.status==200){ alert(xmlHttp.responseText); if (xmlHttp.responseText=="success") { formName.action = submitURL; formName.submit(); } else { document.getElementById("error").innerHTML ="请输入正确的验证码。"; } } } } var url="bbb.php"; xmlHttp.open("post",url,true); xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlHttp.send(postStr);}function refresh() { document.getElementById("codeP").src = "picture.php?tm="+Math.random();}</script><form id="test" name="test" action=""> <div id="error"></div> <div> <img id="codeP" src="picture.php" onclick="refresh()"/> <input id="codeT" type="text" name="codeT" /> </div> <div><input type="button" onclick="sub()" name="apply" id="apply" value="提交" /></div></form> |
以上提及了bbb.php里面的内容自己对照上面的js代码稍微想一下,其实很简单。就不贴了。有什么问题的话可以m我,有什么说的不对的地方,请不要客气。
[转]php 图片验证码生成 前后台验证的更多相关文章
- php 图片验证码生成 前后台验证
自己从前一段时间做了个php小项目,关于生成图片验证码生成和后台的验证,把自己用到的东西总结一下,希望大家在用到相关问题的时候可以有一定的参考性. 首先,php验证码生成. 代码如下: 1.生成图像代 ...
- Flask实战第40天:图片验证码生成技术
图片验证码生成 安装pillow pip install pillow 在utils下新建python package命名为captcha 把需要需要用到的字体放在captcha下 编辑captcha ...
- Atitit 图片 验证码生成attilax总结
Atitit 图片 验证码生成attilax总结 1.1. 图片验证码总结1 1.2. 镂空文字 打散 干扰线 文字扭曲 粘连2 1.1. 图片验证码总结 因此,CAPTCHA在图片验证码这一应用点 ...
- 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等
以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...
- asp.net core 图片验证码,后台验证
验证方法: public static string VerificationCodeCacheFormat="vcode_cache_{0}"; public IActionRe ...
- JavaWeb开发之普通图片验证码生成技术与算术表达式验证码生成技术
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6134649.html 另:算术验证码生成的JSP.Servlet实现均已移植github:https:/ ...
- Web后端 JAVA实现验证码生成与验证功能
首先,写一个验证码生成帮助类,用来绘制随机字母: <span style="font-size:14px;">import java.awt.Color; impor ...
- .net图片验证码生成、点击刷新及验证输入是否正确
①创建ValidateCode.aspx,在ValidateCode.aspx.cs中加入如下代码.生成验证码图片,在页面上输出,输出jpeg格式. protected void Page_Load( ...
- struts---JSP界面验证码生成与验证
之前想做一个随机验证码的功能,自己也搜索了一下别人写的代码,然后自己重新用struts2实现了一下,现在将我自己实现代码贴出来!大家有什么意见都可以指出来! 首先是生成随机验证码图片的action: ...
随机推荐
- 中间件 activeMQ Jms Java Demo
一.什么是ActiveMQ 百度解释: ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provi ...
- 目标检测算法(1)目标检测中的问题描述和R-CNN算法
目标检测(object detection)是计算机视觉中非常具有挑战性的一项工作,一方面它是其他很多后续视觉任务的基础,另一方面目标检测不仅需要预测区域,还要进行分类,因此问题更加复杂.最近的5年使 ...
- node.js使用免费的阿里云ip查询获取ip所在地
在项目过程中,我们常常需要获取IP的所在地.而这一功能一般都是通过一些数据网站的对外接口来实现,这些接口一般情况下都是付费使用的.在这篇文章中我将记录,基于node.js的阿里云免费IP地址查询接口的 ...
- Android之Activity系列总结(二)--任务和返回栈
任务和返回栈 应用通常包含多个 Activity.每个 Activity 均应围绕用户可以执行的特定操作设计,并且能够启动其他 Activity. 例如,电子邮件应用可能有一个 Activity 显示 ...
- ruby-attr_accessor使用
ruby语法-attr_accessor方法使用 本文主要讲解下ruby下attr_accessor方法的使用. 示例1: class Person end person = Person.new p ...
- 几种归一化方法的概念及python实现
一 (0,1)标准化: 这是最简单也是最容易想到的方法,通过遍历feature vector里的每一个数据,将Max和Min的记录下来,并通过Max-Min作为基数(即Min=0,Max=1)进行数据 ...
- word标题文字居中浅谈
在Word排版时,要将标题在文档居中,是有区别的,如下图 在回车键后,在选择标题居中,我们常认为标题就是在整个文档居中了,但是实际上只是在回车键到右边区域居中而已,如上图红色方块居中. 只有在标题文字 ...
- .NET Core部署中你不了解的框架依赖与独立部署
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9703460.html NET Core项目发布的时候你有没有注意到这两个选项呢?有没有纠结过框架依赖与独 ...
- Struts框架(6)---action接收请求参数
action接收请求参数 在web开发中,去接收请求参数来获得表单信息非常的常见,自己也总结整理了有关Struts2通过action接收请求参数的几种方法. Struts2 提供三种数据封装的方式: ...
- linux overcommit flag
linux中有一个overcomit的配置,这个配置关系到进程在过多申请memory资源的时候,系统的表现(启发式允许,不检查,or 阻止) /proc/sys/vm/overcommit_memor ...