基于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 相关文章推荐
非常不错的MySQL优化的8条经验
Mar 24 PHP
PHP用GD库生成高质量的缩略图片
Mar 09 PHP
php设计模式 DAO(数据访问对象模式)
Jun 26 PHP
ecshop实现smtp发送邮件
Feb 03 PHP
解决nginx不支持thinkphp中pathinfo的问题
Jul 21 PHP
PHP中如何防止外部恶意提交调用ajax接口
Apr 11 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
Oct 08 PHP
PHP 芝麻信用接入的注意事项
Dec 01 PHP
thinkphp分页集成实例
Jul 24 PHP
Laravel框架分页实现方法分析
Jun 12 PHP
PHP实现正则匹配所有括号中的内容
Jun 22 PHP
用PHP做了一个领取优惠券活动的示例代码
Jul 05 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
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
Javascript UrlDecode函数代码
2010/01/09 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
JS简单计算器实例
2015/01/20 Javascript
javascript的switch用法注意事项分析
2015/02/02 Javascript
Bootstrap 实现查询的完美方法
2016/10/26 Javascript
Javascript基于jQuery UI实现选中区域拖拽效果
2016/11/25 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
Vue导出页面为PDF格式的实现思路
2018/07/31 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
javascript中数组的常用算法深入分析
2019/03/12 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
详解vue-router的导航钩子(导航守卫)
2020/11/02 Javascript
[46:20]TFT vs Secret Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
在python win系统下 打开TXT文件的实例
2018/04/29 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
python 如何快速复制序列
2020/09/07 Python
CSS3 开发工具收集
2010/04/17 HTML / CSS
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
死亡赔偿协议书
2015/01/28 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
jquery插件实现悬浮的菜单
2021/04/24 jQuery
Pandas加速代码之避免使用for循环
2021/05/30 Python
nginx配置之并发频次限制
2022/04/18 Servers