PHP生成各种常见验证码和Ajax验证过程


Posted in PHP onJanuary 10, 2016

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

PHP生成各种常见验证码和Ajax验证过程

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下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
PHP XML操作的各种方法解析(比较详细)
Jun 17 PHP
php中取得URL的根域名的代码
Mar 23 PHP
php将fileterms函数返回的结果变成可读的形式
Apr 21 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
Sep 16 PHP
php实例分享之html转为rtf格式
Jun 02 PHP
解决cPanel无法安装php5.2.17
Jun 22 PHP
老版本PHP转义Json里的特殊字符的函数
Jun 08 PHP
thinkphp配置文件路径的实现方法
Aug 30 PHP
php版微信数据统计接口用法示例
Oct 12 PHP
swoole和websocket简单聊天室开发
Nov 18 PHP
PHP实现防止表单重复提交功能【基于token验证】
May 24 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
Jan 09 #PHP
PHP统计目录中文件以及目录中目录大小的方法
Jan 09 #PHP
PHP基于单例模式实现的mysql类
Jan 09 #PHP
thinkPHP查询方式小结
Jan 09 #PHP
thinkPHP中多维数组的遍历方法
Jan 09 #PHP
ThinkPHP中html:list标签用法分析
Jan 09 #PHP
thinkphp中字符截取函数msubstr()用法分析
Jan 09 #PHP
You might like
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
php模拟js函数unescape的函数代码
2012/10/20 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
PHP实现在线阅读PDF文件的方法
2015/06/17 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
2016/06/21 PHP
Yii2框架dropDownList下拉菜单用法实例分析
2016/07/18 PHP
php生成条形码的图片的实例详解
2017/09/13 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
jQuery获取当前点击的对象元素(实现代码)
2016/05/19 Javascript
jQuery simpleModal插件的使用介绍
2016/08/30 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
2017/07/11 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
2018/09/01 Javascript
vue实现搜索功能
2019/05/28 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
python实现猜拳小游戏
2020/04/05 Python
python requests证书问题解决
2019/09/05 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
python 如何快速复制序列
2020/09/07 Python
css3+jq创作含苞待放的荷花
2014/02/20 HTML / CSS
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
英国领先的独立时装店:Van Mildert
2019/10/28 全球购物
什么是属性访问器
2015/10/26 面试题
为什么Runtime.exec(“ls”)没有任何输出?
2014/10/03 面试题
艺术爱好者的自我评价分享
2013/10/08 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers