宁泽林_NiZerin - 互联网技术博客

  • 首页
  • 交流群
  • 关于我
  • 留言版
  1. 首页
  2. PHP
  3. 正文

使用php生成数字、字母组合验证码

2018年10月22日 3347点热度 0人点赞 0条评论

项目中经常会遇到一些登陆验证,支付验证等等一系列安全验证的策略。实现方法多种多样,下面就来讲解下如何用php生成简单的文字+数字组合的验证码:
所用语言php,gd库
Github地址:https://github.com/CrazyNing98/SomePHPcode
原理解释:
a>实质上是在服务器端随机生成验证码,将其存储在$_SESSION中。
b>然后将验证码写在图片上,将图片发送至客户端,用户输入图片的上的验证码,递交给服务器。
c>服务端再与$_SESSION中存储的信息比对,一致则通过,否则不通过。

php开发使用php生成数字、字母组合验证码

分为两步:
1)第一步服务器端生成验证码
2)客户端使用验证码
第一步:在服务器端如何生成验证码:<Yanzm.php>

<?php
/**
 * Created by PhpStorm.
 * User: Carzy_Ning
 * Date: 2018/10/20
 * Time: 19:32
 */
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=10;
 $fontcolor=imagecolorallocate($image,rand(20,100),rand(30,100),rand(10,200));
 $str="qwertyuiopasdfghjklzxvbnm1234567890";//给出一个字符串,用于生成随机验证码
 $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);//销毁内存中的底图

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

<?php
/**
 * Created by PhpStorm.
 * User: Carzy_Ning
 * Date: 2018/10/20
 * Time: 19:34
 */
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();
}
?>

第三步:生成用户界面<index.php>

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>验证码demo</title>
</head>
</html>
<body>
<form action="./retrun.php">
 <p>验证码图片:<br>
<!-- //点击验证码图片本身进行验证码的切换(需求一)-->
<!-- //生成随机数字,便于访问服务端,如果地址是相同的则浏览器不会刷新访问-->
         <img id="captCode" src="./Yanzm.php?=<?php echo rand();?>" width="100px;height:100px;" alt=""
 onclick="this.src='Yanzm.php?+ Math.random()'">
<!-- //点击‘点击切换’,切换验证码(需求二)-->
 <a href="javascript:void(0)" onclick="document.getElementById('captCode').src='Yanzm.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开发使用php生成数字、字母组合验证码

Github地址:https://github.com/CrazyNing98/SomePHPcode

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: php
最后更新:2018年10月22日

NiZerin

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

取消回复

NiZerin

这个人很懒,什么都没留下

本站小程序

   

内容将于本站同步

本站公众号

每周推送最新前沿技术文章

最新 热点 随机
最新 热点 随机
Laravel 8 性能优化自查清单 Laravel 7 已停止维护 Laravel: 新的发行时间表(2021 后改为一年一更) PHP8 已经发布,来看看有哪些新特性吧 Laravel 8 将于9月8日发布! Laravel 重大安全更新
Laravel 7 已停止维护Laravel: 新的发行时间表(2021 后改为一年一更)Laravel 8 性能优化自查清单
DUX5.1大前端最新主题破解版分享下载 前端大佬交流群--vue node react 使用PHP结合Ffmpeg快速搭建流媒体服务实践 Laravel 7 已停止维护 Python进阶:自定义对象实现切片功能 详解 PHP 7.4 的类型属性
标签聚合
vue flutter wordpress javascript react php laravel node go translations
最近评论
发布于 1 周前(04月09日) 还不错
发布于 3 周前(03月25日) > 您可以添加到收藏夹,以后常来看看 我添加啦,常来,一定。
发布于 4 周前(03月19日) 不错
发布于 1 个月前(03月07日) 哈哈哈哈
发布于 1 个月前(03月07日) 哈哈哈哈哈
友情链接
  • 科学上网
  • 阿里云特惠
  • 宝塔运维特惠
  • PHP函数字典

COPYRIGHT © 2021 宁泽林_NiZerin - 互联网技术博客. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS