项目中经常会遇到一些登陆验证,支付验证等等一系列安全验证的策略。实现方法多种多样,下面就来讲解下如何用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>验证码图片:<br>
//点击验证码图片本身进行验证码的切换(需求一)
//生成随机数字,便于访问服务端,如果地址是相同的则浏览器不会刷新访问
        <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. 4.App测试与Web测试的不同

    注释:*蓝色为不同点,红色为测试类型* 测试工具不同 Web自动化用Selenium APP自动化用Appium 软件架构不同 App为C/S架构 Web为B/S架构 需要进行安装卸载更新测试 第一次 ...

  2. Python学习笔记第十六周

    目录: 一.CSS补充 1.页面布局 二.JavaScript补充 1.条件判断 2.函数分类 3.序列化 4.转义 5.eval 6.时间 7.作用域 三.DOM 1.间接查找 文本操作 样式操作 ...

  3. 【特征提取】MultiBlock-LBP特征

    MB-LBP特征,注意区分是Multi-block LBP还是MultiScale Block LBP,区别是是否使用了多尺度方法.其中Multiscale Block LBP,来源于论文,中科院的人 ...

  4. 使用Git去管理修改

    Git跟踪的是修改而不是文件本身. 看下面一个例子 首先我们修改我们Git管理的git.txt文件 如下: 然后添加: 然后我们再去修改git.txt这个文件 然后直接提交到分支里如图: 也就是说我们 ...

  5. ZOJ - 4082:Little Sub and his Geometry Problem (双指针)

    Little Sub loves math very much, and has just come up with an interesting problem when he is working ...

  6. PS不显示图片

    最近安装Adobe AIR的时候因为安装不了,删除了相关的配置文件,安装了Adobe AIR之后,用PS打开图片的时候发现不显示图片了,如图: 最后通过万能的百度了解到了是笔记本都采用了双显卡(i3. ...

  7. 20155208徐子涵 2016-2017-2 《Java程序设计》第7周学习总结

    20155208徐子涵 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十三章 时间与日期 13.1 认识时间与日期 就目前来说,即使标注为GMT(无论是文 ...

  8. windows 10 下sublime text 3配置c/c++编译环境

    来源于在网上各种帖子,自己成功配置之后写作笔记: 检查环境变量 首先配置重定义环境变量,过程如下: 创建一个test.c文件 内容: #include <stdio.h> int main ...

  9. linux----别名

    经常一些命令太长,输入太麻烦,给该命令起个别名,直接执行,简单又方便. 1.查看别名 alias 2.编辑别名 vi ~/.brashrc 3.添加自己的别名 例如:重启网卡 alias netres ...

  10. linux----CenterOS7中在线安装jdk

    summary: 一直以来,都在windows上玩java,今天是一个具有里程碑的一天,感觉正式踏入进入了linux大门. 原来一直以为在linux上安装jdk,需要去官网下载适合linux的jdk, ...