基于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 相关文章推荐
php 连接mssql数据库 初学php笔记
Mar 01 PHP
Apache2中实现多网站域名绑定的实现方法
Jun 01 PHP
php explode函数实例代码
Feb 27 PHP
PHP中操作ini配置文件的方法
Apr 25 PHP
PHP COOKIE及时生效的方法介绍
Feb 14 PHP
PHP实现远程下载文件到本地
May 17 PHP
php中foreach结合curl实现多线程的方法分析
Sep 22 PHP
php类的自动加载操作实例详解
Sep 28 PHP
PHPMailer发送邮件
Dec 28 PHP
PHP生成腾讯云COS接口需要的请求签名
May 20 PHP
PDO::lastInsertId讲解
Jan 29 PHP
Yii 使用intervention/image拓展实现图像处理功能
Jun 22 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
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
jquery JSON的解析方式
2009/07/25 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
JavaScript中的操作符类型转换示例总结
2016/05/30 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
2020/12/02 Vue.js
Python中删除文件的程序代码
2011/03/13 Python
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
django 按时间范围查询数据库实例代码
2018/02/11 Python
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
医学专业大学生求职的自我评价
2013/11/27 职场文书
英语商务邀请函范文
2014/01/16 职场文书
银行进社区活动总结
2014/07/07 职场文书
员工辞职信范文
2015/03/02 职场文书
工作一年自我鉴定
2019/06/20 职场文书
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers