基于PHP制作验证码


Posted in PHP onOctober 12, 2016

网站注册、登录又或者是留言页面,都需要注册码来验证当前操作者的合法性,为了防止网站被机器恶意注册。

生成验证码无非就那么几个步骤,首先是获取一个随机字符串,然后创建一个布画,将生成的字符串写到布画上,我们还可以在布画上画线画雪花,现在帖一段生成验证码的代码。

源代码:

<?php
session_start(); //开启session
//创建随机码,并保存在session中
for($i=0;$i<4;$i++)
{
$_nmsg.=dechex(mt_rand(0,15));
}
//保存到session中
$_SESSION['code']=$_nmsg;
//设置图片长和高

$_width=75;
$_height=25;
//创建一张图像
$_img=imagecreatetruecolor($_width,$_height);

//白色背景
$_white=imagecolorallocate($_img,255,255,255);
//填充到背景上
imagefill($_img,0,0,$_white);

//黑色边框
$_black=imagecolorallocate($_img,0,0,0);
imagerectangle($_img,0,0,$_width-1,$_height-1,$_black);

//随即画出5个线条
for($i=0;$i<5;$i++)
{
$_rnd_color=imagecolorallocate($_img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
imageline($_img,mt_rand(0,$_width),mt_rand(0,$_height),mt_rand(0,$_width),mt_rand(0,$_height),$_rnd_color);
}

//雪花
for($i=0;$i<10;$i++)
{
$_rnd_color=imagecolorallocate($_img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
imagestring($_img,1,mt_rand(1,$_width),mt_rand(1,$_height),"*",$_rnd_color);
}

//输出验证码

for($i=0;$i<strlen($_SESSION['code']);$i++)
{
imagestring($_img,5,10+$i*15,mt_rand(0,10),$_SESSION['code'][$i],$_blackr);
}

//输出图像
header('Content-Type:image/png');
imagepng($_img);
//销毁图像
imagedestroy($_img);
?>

代码中将使用以下函数:

mt_rand — 生成更好的随机数
int mt_rand ([ int $min ], int $max )很多老的 libc 的随机数发生器具有一些不确定和未知的特性而且很慢。PHP 的 rand() 函数默认使用 libc 随机数发生器。

mt_rand()函数是非正式用来替换它的。该函数用了Mersenne Twister中已知的特性作为随机数发生器,它可以产生随机数值的平均速度比 libc 提供的 rand() 快四倍。

dechex — 十进制转换为十六进制返回一字符串,包含有给定 number参数的十六进制表示。所能转换的最大数值为十进制的 4294967295,其结果为 "ffffffff"。

imagecreatetruecolor — 新建一个真彩色图像
resource imagecreatetruecolor ( int $x_size , int $y_size )

imagecreatetruecolor() 返回一个图像标识符,代表了一幅大小为 x_size 和 y_size 的黑色图像。

imagecolorallocate — 为一幅图像分配颜色
int imagecolorallocate ( resource $image , int $red , int $green , int $blue )
imagecolorallocate() 返回一个标识符,代表了由给定的 RGB 成分组成的颜色。red,green 和 blue 分别是所需要的颜色的红,绿,蓝成分。这些参数是 0 到 255 的整数或者十六进制的 0x00 到 0xFF。imagecolorallocate()必须被调用以创建每一种用在 image 所代表的图像中的颜色。

imagefill — 区域填充
bool imagefill ( resource $image , int $x , int $y , int $color )
imagefill() 在 image图像的坐标 x,y(图像左上角为 0, 0)处用 color颜色执行区域填充(即与 x, y 点颜色相同且相邻的点都会被填充)。

imagerectangle — 画一个矩形
bool imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $col )
imagerectangle() 用 col 颜色在 image 图像中画一个矩形,其左上角坐标为 x1, y1,右下角坐标为 x2, y2。图像的左上角坐标为 0, 0。

imageline — 画一条线段
bool imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )
imageline() 用 color颜色在图像 image 中从坐标 x1,y1 到 x2,y2(图像左上角为 0, 0)画一条线段。

imagestring — 水平地画一行字符串
bool imagestring ( resource $image , int $font , int $x , int $y , string $s , int $col )
imagestring() 用 col颜色将字符串 s 画到 image所代表的图像的 x,y坐标处(这是字符串左上角坐标,整幅图像的左上角为 0,0)。如果 font 是 1,2,3,4 或 5,则使用内置字体。

imagepng — 以 PNG 格式将图像输出到浏览器或文件
imagepng() 将 GD 图像流(image)以 PNG 格式输出到标准输出(通常为浏览器),或者如果用 filename 给出了文件名则将其输出到该文件。

imagedestroy — 销毁一图像

imagedestroy() 释放与 image 关联的内存。

将源代码保存为code.php是个php文件,我们该如何使用他呢?

imagepng已经将这个php文件输出成了png文件

直接调用就可以了

<img src="mycode.php"/>

如果要使用验证码,记得开启session哦

<?php
session_start();
echo $_SESSION['code'];
?>

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

PHP 相关文章推荐
3种平台下安装php4经验点滴
Oct 09 PHP
php学习之数据类型之间的转换介绍
Jun 09 PHP
php获取淘宝分类id示例
Jan 16 PHP
ThinkPHP验证码使用简明教程
Mar 05 PHP
PHP入门经历和学习过程分享
Apr 11 PHP
PHP实现的简单mock json脚本分享
Feb 10 PHP
PHP 数组遍历foreach语法结构及实例
Jun 13 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
ThinkPHP实现生成和校验验证码功能
Apr 28 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 PHP
PHP中递归的实现实例详解
Nov 14 PHP
实现PHP搜索加分页
Oct 12 #PHP
如何使用PHP给图片加水印
Oct 12 #PHP
php版微信数据统计接口用法示例
Oct 12 #PHP
php版微信js-sdk支付接口类用法示例
Oct 12 #PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
Oct 12 #PHP
如何使用php等比例缩放图片
Oct 12 #PHP
php与python实现的线程池多线程爬虫功能示例
Oct 12 #PHP
You might like
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
innerHTML,outerHTML,innerTEXT三者之间的区别
2007/01/28 Javascript
javascript 单选框,多选框美化代码
2008/08/01 Javascript
jQuery 前的按键判断代码
2010/03/19 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
JS 获取select(多选下拉)中所选值的示例代码
2013/08/02 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
javascript中 try catch用法
2015/08/16 Javascript
15位和18位身份证JS校验的简单实例
2016/07/18 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
2018/03/09 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
Python continue语句用法实例
2014/03/11 Python
python图像常规操作
2017/11/11 Python
python os.fork() 循环输出方法
2019/08/08 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
类、抽象类、接口的差异
2016/06/13 面试题
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
《争吵》教学反思
2014/02/15 职场文书
求职信结尾怎么写
2014/05/26 职场文书
俄语专业毕业生求职信
2014/07/12 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
2015年环保局工作总结
2015/05/22 职场文书
Python函数中的不定长参数相关知识总结
2021/06/24 Python