基于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 相关文章推荐
实现 win2003 下 mysql 数据库每天自动备份
Dec 06 PHP
将数组写入txt文件 var_export
Apr 21 PHP
AJAX的跨域访问-两种有效的解决方法介绍
Jun 22 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
Aug 21 PHP
PHP实现HTML页面静态化的方法
Nov 04 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
Oct 08 PHP
PHP 匿名函数与注意事项详细介绍
Nov 26 PHP
php使用curl代理实现抓取数据的方法
Feb 03 PHP
laravel自定义分页效果
Jul 23 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
Apr 04 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 PHP
Yii框架响应组件用法实例分析
Sep 04 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
Php部分常见问题总结
2006/10/09 PHP
深入解析fsockopen与pfsockopen的区别
2013/07/05 PHP
10款实用的PHP开源工具
2015/10/23 PHP
php基于session锁防止阻塞请求的方法分析
2017/08/07 PHP
jquery 简单图片导航插件jquery.imgNav.js
2010/03/17 Javascript
修复ie8&amp;chrome下window的resize事件多次执行
2011/10/20 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
jquery如何获取复选框的值
2013/12/12 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
jquery仿ps颜色拾取功能
2017/03/08 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
js+html5实现复制文字按钮
2017/07/15 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
layui 弹出层值回传解决方式
2019/11/14 Javascript
[01:08:57]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第二场
2014/05/24 DOTA
Python的string模块中的Template类字符串模板用法
2016/06/27 Python
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
详解Python 正则表达式模块
2018/11/05 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
python各种excel写入方式的速度对比
2020/11/10 Python
英国派对礼服和连衣裙购物网站:TFNC London
2018/07/07 全球购物
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
某公司C#程序员面试题笔试题
2014/05/26 面试题
教育系毕业生中文求职信范文
2013/10/06 职场文书
写给女生的道歉信
2014/01/08 职场文书
中学生打架检讨书
2014/02/10 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python