PHP生成各种随机验证码的方法总结【附demo源码】


Posted in PHP onJune 05, 2017

本文实例总结了PHP生成各种随机验证码的方法。分享给大家供大家参考,具体如下:

验证码在WEB应用中非常重要,通常用来防止用户恶意提交表单,如恶意注册和登录、论坛恶意灌水等。本文将通过实例讲解使用PHP生成各种常见的验证码包括数字验证码、数字+字母验证码、中文验证码、算术验证码等等以及其Ajax验证过程。

PHP生成各种随机验证码的方法总结【附demo源码】

点击此处本站下载示例源码

PHP生成验证码图片

PHP生成验证码的原理:使用PHP的GD库,生成一张带验证码的图片,并将验证码保存在Session中。PHP生成验证码的大致流程有:

1、产生一张png的图片;

2、为图片设置背景色;

3、设置字体颜色和样式;

4、产生4位数的随机的验证码;

5、把产生的每个字符调整旋转角度和位置画到png图片上;

6、加入噪点和干扰线防止注册机器分析原图片来恶意破解验证码;

7、输出图片;

8、释放图片所占内存。

示例代码:

session_start();
getCode(4,60,20);
function getCode($num,$w,$h) {
  $code = "";
  for ($i = 0; $i < $num; $i++) {
    $code .= rand(0, 9);
  }
  //4位验证码也可以用rand(1000,9999)直接生成
  //将生成的验证码写入session,备验证时用
  $_SESSION["helloweba_num"] = $code;
  //创建图片,定义颜色值
  header("Content-type: image/PNG");
  $im = imagecreate($w, $h);
  $black = imagecolorallocate($im, 0, 0, 0);
  $gray = imagecolorallocate($im, 200, 200, 200);
  $bgcolor = imagecolorallocate($im, 255, 255, 255);
  //填充背景
  imagefill($im, 0, 0, $gray);
  //画边框
  imagerectangle($im, 0, 0, $w-1, $h-1, $black);
  //随机绘制两条虚线,起干扰作用
  $style = array ($black,$black,$black,$black,$black,
    $gray,$gray,$gray,$gray,$gray
  );
  imagesetstyle($im, $style);
  $y1 = rand(0, $h);
  $y2 = rand(0, $h);
  $y3 = rand(0, $h);
  $y4 = rand(0, $h);
  imageline($im, 0, $y1, $w, $y3, IMG_COLOR_STYLED);
  imageline($im, 0, $y2, $w, $y4, IMG_COLOR_STYLED);
  //在画布上随机生成大量黑点,起干扰作用;
  for ($i = 0; $i < 80; $i++) {
    imagesetpixel($im, rand(0, $w), rand(0, $h), $black);
  }
  //将数字随机显示在画布上,字符的水平间距和位置都按一定波动范围随机生成
  $strx = rand(3, 8);
  for ($i = 0; $i < $num; $i++) {
    $strpos = rand(1, 6);
    imagestring($im, 5, $strx, $strpos, substr($code, $i, 1), $black);
    $strx += rand(8, 12);
  }
  imagepng($im);//输出图片
  imagedestroy($im);//释放图片所占内存
}

代码中,自定义函数getCode()诠释了验证码的生成过程。运用PHP GD库自带的图像处理函数,能轻松生成各种想要的图片效果。

imagecreate():创建一个新图像

imagecolorallocate():为图像分配颜色

imagefill():填充图像

imagerectangle():画一个矩形(边框)

imagesetstyle():设置画线风格

imageline():画一条线段

imagesetpixel():画点像素

imagepng():以PNG格式将图像输出到浏览器或文件

imagedestroy():释放图片所占内存

将上述代码保存为code_num.php,以便调用。

Ajax刷新和验证

验证码生成后,我们要在实际的项目中应用,通常我们使用ajax可以实现点击验证码时刷新生成新的验证码(有时生成的验证码肉眼很难识别),即“看不清换一张”。填写验证码后,还需要验证所填验证码是否正确,验证的过程是要后台程序来完成,但是我们也可以通过ajax来实现无刷新验证。

我们建立一个前端页面index.html,载入jQuery,同时在body中加入验证码表单元素:

<p>验证码:<input type="text" class="input" id="code_num" name="code_num" maxlength="4" />
<img src="code_num.php" id="getcode_num" title="看不清,点击换一张" align="absmiddle"></p>
<p><input type="button" class="btn" id="chk_num" value="提交" /></p>

html代码中,<img src=”code_num.php”即调用了生成的验证码,当点击验证码时,刷新生成新的验证码:

$(function(){
  //数字验证
  $("#getcode_num").click(function(){
    $(this).attr("src",'code_num.php?' + Math.random());
  });
  ...
});

刷新验证码,其实就是重新请求了验证码生成程序,这里要注意的是调用code_num.php时要带上随机参数防止缓存。接下来填写好验证码之后,点“提交”按钮,通过$.post(),前端向后台chk_code.php发送ajax请求。

$(function(){
  ...
  $("#chk_num").click(function(){
    var code_num = $("#code_num").val();
    $.post("chk_code.php?act=num",{code:code_num},function(msg){
      if(msg==1){
        alert("验证码正确!");
      }else{
        alert("验证码错误!");
      }
    });
  });
});

后台chk_code.php验证:

session_start();
$code = trim($_POST['code']);
if($code==$_SESSION["helloweba_num"]){
  echo '1';
}

后台根据提交的验证码与保存在session中的验证码比对,完成验证。

对于其他几种验证的生成和使用,其原理一样,开发者可以根据需要,产生多种样式的随机验证码,本文演示demo中提供了数字验证码、数字+字母验证码、中文验证码、仿google验证码,算术验证码等。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
一个域名查询的程序
Oct 09 PHP
深入理解PHP原理之异常机制
Aug 21 PHP
PHP中使用cURL实现Get和Post请求的方法
Mar 13 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
PHP独立Session数据库存储操作类分享
Jun 11 PHP
PHP CURL 内存泄露问题解决方法
Feb 12 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
Mar 17 PHP
浅谈PDO的rowCount函数
Jun 18 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
Aug 18 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
Apr 07 PHP
php使用PDO执行SQL语句的方法分析
Feb 16 PHP
YII框架批量插入数据的方法
Mar 18 PHP
Windows 下安装 swoole 图文教程(php)
Jun 05 #PHP
PHP手机号中间四位用星号*代替显示的实例
Jun 02 #PHP
总结一些PHP中好用但又容易忽略的小知识
Jun 02 #PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
Jun 02 #PHP
Yii2中简单的场景使用介绍
Jun 02 #PHP
Yii 2.0中场景的使用教程
Jun 02 #PHP
详解PHP5.6.30与Apache2.4.x配置
Jun 02 #PHP
You might like
PHP为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
php注销代码(session注销)
2012/05/31 PHP
解析php addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
jQuery中queue()方法用法实例
2014/12/29 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
2016/01/26 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
2018/01/08 Javascript
详解AngularJS之$window窗口对象
2018/01/17 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
2019/04/13 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
Python实现一个简单的验证码程序
2017/11/03 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
安纳塔拉酒店度假村及水疗官方网站:Anantara Hotel
2016/08/25 全球购物
比利时买床:Beter Bed
2017/12/06 全球购物
网络维护中文求职信
2014/01/03 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python
压缩Redis里的字符串大对象操作
2021/06/23 Redis