本文转自: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();
// 声明一个sessoin
session_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,上面的不小于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);
?>

图片验证的方式有两种:

1.后台验证,在你提交的页面中取得你填写的验证码和session中的验证码是否一致,在做相关操作。

后台验证比较简单,直接贴一下代码。(假如的form表单中要提交的checked.php)

1
2
3
4
5
6
7
8
9
<?php
session_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 图片验证码生成 前后台验证的更多相关文章

  1. php 图片验证码生成 前后台验证

    自己从前一段时间做了个php小项目,关于生成图片验证码生成和后台的验证,把自己用到的东西总结一下,希望大家在用到相关问题的时候可以有一定的参考性. 首先,php验证码生成. 代码如下: 1.生成图像代 ...

  2. Flask实战第40天:图片验证码生成技术

    图片验证码生成 安装pillow pip install pillow 在utils下新建python package命名为captcha 把需要需要用到的字体放在captcha下 编辑captcha ...

  3. Atitit 图片 验证码生成attilax总结

    Atitit 图片 验证码生成attilax总结 1.1. 图片验证码总结1 1.2. 镂空文字  打散 干扰线 文字扭曲 粘连2 1.1. 图片验证码总结 因此,CAPTCHA在图片验证码这一应用点 ...

  4. 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...

  5. asp.net core 图片验证码,后台验证

    验证方法: public static string VerificationCodeCacheFormat="vcode_cache_{0}"; public IActionRe ...

  6. JavaWeb开发之普通图片验证码生成技术与算术表达式验证码生成技术

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6134649.html    另:算术验证码生成的JSP.Servlet实现均已移植github:https:/ ...

  7. Web后端 JAVA实现验证码生成与验证功能

    首先,写一个验证码生成帮助类,用来绘制随机字母: <span style="font-size:14px;">import java.awt.Color;  impor ...

  8. .net图片验证码生成、点击刷新及验证输入是否正确

    ①创建ValidateCode.aspx,在ValidateCode.aspx.cs中加入如下代码.生成验证码图片,在页面上输出,输出jpeg格式. protected void Page_Load( ...

  9. struts---JSP界面验证码生成与验证

    之前想做一个随机验证码的功能,自己也搜索了一下别人写的代码,然后自己重新用struts2实现了一下,现在将我自己实现代码贴出来!大家有什么意见都可以指出来! 首先是生成随机验证码图片的action: ...

随机推荐

  1. IT行业三大定律

    1:摩尔定律 该定律由Inter公司创始人戈登摩尔提出,摩尔定律指出:每一年半计算机等IT产品的性能会翻一番:或者说相同性能的产品在一年半后价格会降一半.   表现为:为适应摩尔定律,IT公司必须在较 ...

  2. Codeforces831C Jury Marks

    C. Jury Marks time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  3. 关于Podfile,某个第三方指定源

    项目中有个指定了源,摸索好久Podfile编写方式,网上都没有 pod 'SDK名字', :source => '指定源' 其他的直接按原来的就可以了

  4. prototype 和 __proto__

    /* * 1.构造函数里有属性及方法----->其构造的实例对象直接通过new构造时获得这些属性和方法 * 2.构造函数里的原型prototype----->这个原型对象:包括1).原型对 ...

  5. gogs 安装

    docker 安装gogs 准备工作 安装一个mysql数据库,创建一个数据库 gogs,字符集为utf-8 查找gogs 镜像 docker search gogs 拉取镜像到本地 docker p ...

  6. tcp/ip 三次握手和4次挥手

    TCP连接两个端口,谁也发起请求,谁就是client端A,另外一个接受请求的server端B.第一次握手:A向B发一个链接请求,带一个seq = x,SYN= x. 第二次握手:B收到链接请求之后向A ...

  7. 《C# 从现象到本质》出版,免费送书10本

    我的第一本书<C# 从现象到本质>已于近日正式在京东和淘宝天猫上开始销售了.至此,我的图书写作和出版活动正式告一段落.图书销售网址见下. 试读样章 京东 天猫 从看书到写书 借着图书出版之 ...

  8. VSCode插件开发全攻略(一)概览

    文章索引 VSCode插件开发全攻略(一)概览 VSCode插件开发全攻略(二)HelloWord VSCode插件开发全攻略(三)package.json详解 VSCode插件开发全攻略(四)命令. ...

  9. 电脑知识,一键开启Win10“超级性能模式”

    现在主流系统以及从WIN7慢慢的转移到了WIN10,微软也为WIN10做了很多优化跟更新.今天要跟大家说的这个功能很多人肯定没有听说过.那就是WIN10的超级性能模式. 1. 大多数Win10是没有滴 ...

  10. 《http权威指南》读书笔记10

    概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...