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查询域名状态whois的类
Nov 25 PHP
PHP 引用是个坏习惯
Mar 12 PHP
PHP操作mysql函数详解,mysql和php交互函数
May 19 PHP
php tp验证表单与自动填充函数代码
Feb 22 PHP
解析htaccess伪静态的规则
Jun 18 PHP
PHP同时连接多个mysql数据库示例代码
Mar 17 PHP
php简单实现多字节字符串翻转的方法
Mar 31 PHP
分享PHP函数实现数字与文字分页代码
Jul 28 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
Oct 19 PHP
PHP可变变量学习小结
Nov 29 PHP
PHP实现查询手机归属地的方法详解
Apr 28 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
Oct 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
NO3第三帝国留言簿制作过程
2006/10/09 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
2016/05/31 PHP
php项目中类的自动加载实例讲解
2019/09/12 PHP
js word表格动态添加代码
2010/06/07 Javascript
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
javascript 闭包疑问
2010/12/30 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
2014/12/29 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
vue-cli之router基本使用方法详解
2017/10/17 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
2019/05/12 Javascript
python装饰器初探(推荐)
2016/07/21 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
html5指南-1.html5全局属性(html5 global attributes)深入理解
2013/01/07 HTML / CSS
斯洛伐克时尚服装网上商店:Cellbes
2016/10/20 全球购物
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
描述JSP和Servlet的区别、共同点、各自应用的范围
2012/10/02 面试题
函授大学生自我鉴定
2014/02/05 职场文书
家具公司总经理岗位职责
2014/07/08 职场文书
通用员工手册范本
2015/05/14 职场文书
导游词之包公祠
2019/11/25 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis
PostgreSQL数据库创建并使用视图以及子查询
2022/04/11 PostgreSQL