项目中经常会遇到一些登陆验证,支付验证等等一系列安全验证的策略。实现方法多种多样,下面就来讲解下如何用php生成简单的文字+数字组合的验证码:

所用语言php,gd库

原理解释:

a>实质上是在服务器端随机生成验证码,将其存储在$_SESSION中。

b>然后将验证码写在图片上,将图片发送至客户端,用户输入图片的上的验证码,递交给服务器。

c>服务端再与$_SESSION中存储的信息比对,一致则通过,否则不通过。

分为两步:

1)第一步服务器端生成验证码

2)客户端使用验证码

第一步:在服务器端如何生成验证码:<code.php>

<?php
session_start();
//1>session_start()必须置于最顶部,2>多服务器,要考虑集中管理session信息
//phpinfo();//打印出php的信息

//1.生成一张底图(width:100;height:30)
$image=imagecreatetruecolor(100,30);
$bgcolor=imagecolorallocate($image,255,255,255);//画笔着色
imagefill($image,0,0,$bgcolor);//将底图的着色 //随机生成四个数字
/*
for($i=0;$i<4;$i++){
$fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));
$fontcontent=rand(0,9);//验证码的内容
$fontsize=6;//字体大小
$x=($i*100/4)+rand(5,10);//x轴
$y=rand(5,10);//Y轴
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);//使用imagestring()将文字写在画布上
}
*/
$captch_code="";
for($i=0;$i<4;$i++){
$fontsize=6;
$fontcolor=imagecolorallocate($image,rand(20,100),rand(30,100),rand(10,200));
$str="abcdefghkmnpwsert1234567890";//给出一个字符串,用于生成随机验证码
$fontcontent=substr($str,rand(0,strlen($str)),1);//每次截取一个字符
$captch_code.=$fontcontent;//拼接
$x=($i*100/4)+rand(5,10);
$y=rand(5,10);
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
$_SESSION['authcode']=$captch_code;//保存在session中
//添加干扰点
for($i=0;$i<100;$i++){
$pointcolor=imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200));
imagesetpixel($image,rand(0,100),rand(0,30),$pointcolor);
}
//添加干扰线
for($i=0;$i<3;$i++){
$linecolor=imagecolorallocate($image,rand(80,200),rand(80,200),rand(80,200));
imageline($image,rand(5,95),rand(5,25),rand(5,95),rand(5,25),$linecolor);
}
ob_clean();//清空缓存
header("content-type:".'image/png');//输出图片的头文件固定格式(可以是image/jpg、image/png、)
imagepng($image);//向浏览器输出一张图片
imagedestroy($image);//销毁内存中的底图 //session_start

第二步:将生成的验证码图片返回给客户端<form.php>

<?php
header("Content-type:text/html;charset=utf-8");//避免出现乱码的情况
if(isset($_REQUEST['authcode'])){
session_start();//使用$_SESSION之前必须使用session_start()
if(strtolower($_REQUEST['authcode'])==$_SESSION["authcode"]){//$_SESSION['authcode']是服务器端存储的验证码,$_REQUEST['authcode']获取客户端输入的信息
echo "<font color='#000cc'>输入正确</font>";
}
else{
echo "<font color='#0000cc'>输入错误</font>";
}
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>验证码正确</title>
</head>
</html>
<body>
<form action="./form.php">
<p>验证码图片:
//点击验证码图片本身进行验证码的切换(需求一)
//生成随机数字,便于访问服务端,如果地址是相同的则浏览器不会刷新访问
        <img id="captCode" src="./code.php?=<?php echo rand();?>" width="100px;height:100px;" alt=""
onclick="this.src='code.php?+ Math.random()'">
//点击‘点击切换’,切换验证码(需求二)
<img id="captCode" src="./code.php?=--><?php //echo rand();?><!--" width="100px;height:100px;" alt="">
<a href="javascript:void(0)" onclick="document.getElementById('captCode').src='code.php?=<?php echo rand();?>'">点击切换?</a>
</p>
<p>请输入验证码的内容:
<input type="text" name="authcode" value=""/>
</p>
<P>
<input type="submit" value="提交" style="padding:6px 20px;"/>
</P>
</form>
</body>

几点异常:

1): 如果出现乱码的情况:header("Content-type:text/html;charset=utf-8");//避免出现乱码的情况

2):如果验证码图片不能显示在前端:那可能是缓存的问题:

事实截图:

  

  

使用php生成数字、字母组合验证码(一)的更多相关文章

  1. php 随机生成数字字母组合

    直接上代码: function getRandomString($len, $chars=null) { if (is_null($chars)) { $chars = "abcdefghi ...

  2. JS生成数字加减乘法验证码

    给大家分享一个简单的js验证码生成代码 PS:该代码依赖Jquery1.4版本以上 传入元素 如productionVerificationCode(#\(("a")) 反回验证码 ...

  3. 使用JavaScript随机生成数字混合字母的验证码

      <script> // 封装一个随机生成数字的函数 function random(a, b) { var n = Math.round(Math.random() * (a - b) ...

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

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

  5. 学习笔记:利用GDI+生成简单的验证码图片

    学习笔记:利用GDI+生成简单的验证码图片 /// <summary> /// 单击图片时切换图片 /// </summary> /// <param name=&quo ...

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

    原文地址:http://www.phpthinking.com/archives/531 验证码在WEB应用中很重要,通经常使用来防止用户恶意提交表单,如恶意注冊和登录.论坛恶意灌水等.本文将通过实例 ...

  7. Servlet实现数字字母验证码图片(二)

    Servlet实现数字字母验证码图片(二): 生成验证码图片主要用到了一个BufferedImage类,如下:

  8. 【Android】java生成炫酷验证码,不区分大小写。登陆,发送手机验证码,防止注册机,android开发

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing 首先给大家看一下 ...

  9. python爬虫scrapy框架——人工识别知乎登录知乎倒立文字验证码和数字英文验证码

    目前知乎使用了点击图中倒立文字的验证码: 用户需要点击图中倒立的文字才能登录. 这个给爬虫带来了一定难度,但并非无法解决,经过一天的耐心查询,终于可以人工识别验证码并达到登录成功状态,下文将和大家一一 ...

  10. python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)

    操作环境:python3 在上一文中python爬虫scrapy框架--人工识别知乎登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前 ...

随机推荐

  1. MyBatis的返回参数类型

    MyBatis的返回参数类型分两种 1. 对应的分类为: 1.1.resultMap: 1.2.resultType: 2 .对应返回值类型: 2.1.resultMap:结果集 2.2.result ...

  2. yii2出现的400错误

    来一段百度来的正常解决方法,注意有很大的坑! 第一种解决办法是关闭Csrf 1配置文件关闭 2控制器里面关闭 public function init(){ $this->enableCsrfV ...

  3. 在阿里云服务器上配置CentOS+Nginx+Python+Flask环境

    在阿里云服务器上配置CentOS+Nginx+Python+Flask环境 项目运行环境 阿里云(单核CPU, 1G内存, Ubuntu 14.04 x64 带宽1Mbps), 具体购买和ssh连接阿 ...

  4. 验证email是否合法

    https://buluo.qq.com/p/detail.html?bid=339910&pid=6675390-1514450689&from=grp_sub_obj 场景1:验证 ...

  5. centos 7安装jenkins

    1. 安装java yum install java 2. 安装jenkins wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci. ...

  6. 【小米oj】找出单独的数字

    题目链接:https://code.mi.com/problem/list/view?id=2&cid=0&sid=26251#codearea 描述 给出N个数字.其中仅有一个数字出 ...

  7. 【Html 学习笔记】第八节——表单实践

    列举一些实践的例子: 1.点击按钮后跳转: <html> <body> <form action="1.html"> First <inp ...

  8. FairyGUI编辑器制作Unity3D UI值得借鉴

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  9. (转)如何转载CSDN的文章

    前言   对于喜欢逛CSDN的人来说,看别人的博客确实能够对自己有不小的提高,有时候看到特别好的博客想转载下载,但是不能一个字一个字的敲了,这时候我们就想快速转载别人的博客,把别人的博客移到自己的空间 ...

  10. Git详解之八 Git与其他系统

    以下内容转载自:http://www.open-open.com/lib/view/open1328070454218.html Git 与其他系统 世界不是完美的.大多数时候,将所有接触到的项目全部 ...