PHP生成各种验证码和Ajax验证

转载链接:http://www.helloweba.com/view-blog-191.html

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

查看演示DEMO下载源码

PHP生成验证码图片

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

1、产生一张png的图片;

2、为图片设置背景色;

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

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

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

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

7、输出图片;

8、释放图片所占内存。

应某位同学的要求,下面我们以

 

helloweba.com的文章评论所用的验证码为例,讲解验证码的生成过程,直接上代码。

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验证码,算术验证码等,点击这里看演示demo。限于篇幅,其他几种验证码的生成代码略过,敬请谅解。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若川的2019年度总结,波澜不惊

从2014年开始写年度总结至今已经六个年头了。正如孔子所说&#xff1a;逝者如斯夫&#xff0c;不舍昼夜。2019年的年度总结写得比较晚&#xff0c;都快农历新年了&#xff0c;此刻在家里继续写完这篇文章。往年基本是元旦之后几天就写完了。我的年度总结尽量写得非技术人员也能…

如何正确选择仓储物流供应商?

如何正确选择仓储物流供应商&#xff1f; 以前有做电商的朋友向我咨询过怎么去选择优质的仓储物流供应商&#xff1f;有哪些能做作为关键问题进行参考。作为一个优秀的合作伙伴是可以为客户提供超乎预期的服务的&#xff0c;上海维佳供应链服务专业提供物流外包解决仓储物流供应…

Realtime Ray Tracing RenderMan Point Cloud

这里演示的是演示的是光线与包围盒测试。在装备Winfast 8800GT 512M的台式机上可以进行每秒4.6亿次点到射线的距离计算计算&#xff0c;用于判断点是否真正的与射线相交。外部数据的填充与准备延迟依旧是GPGPU应用的一个巨大门槛。白色是命中的包围盒&#xff0c;绿色的就是射线…

如何制定有价值的目标

写于2017年07月09日23:29现在修改发布到公众号声明原创公司会制定一系列目标&#xff0c;个人也可以制定一些目标&#xff0c;有利于自我学习成长。那么看我这篇文章可以告诉你如何制定有价值的目标。会制定有价值的目标&#xff0c;绝对超越很多人。SMART原则王健林之前说定个…

清除dns缓存命令行_怎么防止移动dns劫持,防止移动dns劫持要先了解什么是dns劫持...

本人以网络技术出身&#xff0c;近两年接触CDN网络&#xff0c;处理了一些CDN方面的网络问题&#xff0c;大多数以运营商丢包&#xff0c;延迟抖动为主&#xff0c;也处理一些硬件故障&#xff0c;比如机械硬盘的读写io测试&#xff0c;内存条兼容性测试&#xff0c;服务器IPMI…

移动硬盘格式化(pc和mac共用)-菜鸟级解决方案[转]

用pc的时候买了一个320G的移动硬盘&#xff0c;从来没考虑过什么格式化的问题&#xff0c;插上就用了。 后来接触mac才发现pc和mac在移动存储设备的格式化上还是有不少冲突的。如果你的移动硬盘mac上不能修改&#xff0c;或者pc上找不到&#xff0c;那就尽情得批判万恶的资本主…

回答知乎问题:你写过什么自认为惊艳的诗?

首次整理于 2019-07-27 22:04:00&#xff0c;现在整理发布在公众号申明原创。整理了一下大学期间2012年&#xff5e;2016年发布在QQ空间&#xff0c;自己感觉写得还行的七首“诗词”。回答知乎问题&#xff1a;你写过什么自认为惊艳的诗&#xff1f;中国古诗词博大精深。小时候…

密码可逆不可逆选择_膝关节损伤不可逆!跑步要注意!

膝盖同时也是运动者最常受伤的关节。根据美国运动医学整型外科协会的报告&#xff0c;美国每年约有三百万人拉伤、挫伤、或扭伤他们的膝部&#xff0c;其中约有一半是因为运动引起的。而对于跑者而言&#xff0c;影响最大的就是我们的膝关节。换言之&#xff0c;长跑的潜在危害…

面试官问:能否模拟实现JS的call和apply方法

写于2018年11月30日&#xff0c;发布在掘金上阅读量近一万&#xff0c;现在发布到微信公众号申明原创。相对比较基础的知识&#xff0c;虽然日常开发可能用得比较少&#xff0c;各种源码中有很多call和apply&#xff0c;需要掌握。前言这是面试官问系列的第三篇&#xff0c;旨在…

prometheus 发送恢复 值_Prometheus基础知识介绍

【编者的话】本文会让你了解Prometheus是什么&#xff0c;并让你理解它在监控领域的适用场景。Prometheus起源很久以前&#xff0c;加利福尼亚州山景城有一家名为Google的公司。他们推出了大量产品&#xff0c;其中最著名的是广告系统和搜索引擎平台。为了运行这些不同的产品&a…

面试官问:JS的this指向

写于2018年12月25日&#xff0c;发布在掘金上阅读量近一万&#xff0c;现在发布到微信公众号申明原创。前言这是面试官问系列的第四篇&#xff0c;旨在帮助读者提升JS基础知识&#xff0c;包含new、call、apply、this、继承相关知识。面试官问系列文章如下&#xff1a;感兴趣的…

要做PPT,一直找不到资源?

写于 2016年6月&#xff0c;工作后就很少做PPT了。但工作至今也有人问我如何做PPT有没有模板之类的问题&#xff08;比如&#xff1a;大学室友做公司年度汇报时也找到我问有没有模板&#xff0c;我发了这篇文章给他&#xff0c;他说不记得我写了这篇文章呀&#xff09;&#xf…

Linux系统安装Appach 2.4.6

转载链接&#xff1a;http://www.cnblogs.com/kerrycode/p/3261101.html Apache简介 Apache HTTP Server&#xff08;简称Apache&#xff09;是Apache软件基金会的一个开放源码的网页服务器&#xff0c;可以在大多数计算机操作系统中运行&#xff0c;由于其多平台和安全性被广…

学习 redux 源码整体架构,深入理解 redux 及其中间件原理

如果觉得内容不错&#xff0c;可以设为星标置顶我的公众号1. 前言你好&#xff0c;我是若川。这是学习源码整体架构系列第八篇。整体架构这词语好像有点大&#xff0c;姑且就算是源码整体结构吧&#xff0c;主要就是学习是代码整体结构&#xff0c;不深究其他不是主线的具体函数…

pdf安装包_有么有pdf控件,不需要用户安装任何安装包直接打印的?

如果开发一个软件&#xff0c;需要用到PDF功能&#xff0c;您的选择是基于Adobe PDF吗&#xff1f; 如果是基于Adobe PDF&#xff0c;需要用户安装一个几十M的Adobe的安装包&#xff0c;这显然是不友好的。即使目前也有了一些其它的阅读器&#xff0c;大小也还好。但是&#xf…

[转] C#异步操作

Title 通过委托实现异步调用中BeginInvoke及回调函数的使用 通过委托实现异步调用的步骤&#xff1a; 1.定义委托。 2.将要进行异步调用的方法“实例化”到定义的委托。 3.在委托上调用BeginInvoke方法。其中&#xff0c;BeginInvoke的参数由三个部分构成。第一部分&#xff1…

HTTP Server Error 500 内部服务器错误

问题&#xff1a;HTTP500错误 或 Server Application Error ------------------------------------Server Application ErrorThe server has encountered an error while loading an application during the processing of your request. Please refer to the event log for mo…

使用 ohmyzsh 打造 windows、ubuntu、mac 系统高效终端命令行工具

如果觉得内容不错&#xff0c;可以设为星标置顶我的公众号原标题名&#xff1a;oh my zsh 和 windows git bash 设置别名提高效率写于2018年06月03日在我的微信交流群中听闻很多前端开发比较贫穷&#xff0c;没有买mac电脑&#xff08;比如我&#xff09;&#xff0c;也没有用过…

request获取mac地址_【Go】获取用户真实的ip地址

原文链接&#xff1a;https://blog.thinkeridea.com/201903/go/get_client_ip.html用户请求到达提供服务的服务器中间有很多的环节&#xff0c;导致服务获取用户真实的 ip 非常困难&#xff0c;大多数的框架及工具库都会封装各种获取用户真实 ip 的方法&#xff0c;在 exnet 包…

iPhone开发四剑客之《Objective-C基础教程》

iPhone 开发四剑客之《Objective-C 基础教程》 Objective-C 语言是 C 语言的一个扩展集&#xff0c;许多&#xff08;可能是大多数&#xff09;具备 Mac OS X 外观的应用程序都是使用该语言开发的。它以 C 语言为基础&#xff0c;添加了一些微妙但意义重大的特性。 苹果公司为…