搜索
首页php教程php手册PHP生成图像验证码(GD库的使用)
PHP生成图像验证码(GD库的使用)Jun 13, 2016 am 10:29 AM
gd库php

验证码可以用在类似于用户登录、注册等需要验证的页面,防止恶意的或非人为的登录、注册等。

这里记录一下所学到的知识与大家分享。

什么是GD库

PHP手册中的介绍:

PHP 并不仅限于创建 HTML 输出, 它也可以创建和处理包括 GIF, PNG, JPEG, WBMP 以及 XPM 在内的多种格式的图像。 更加方便的是,PHP 可以直接将图像数据流输出到浏览器。 要想在 PHP 中使用图像处理功能,你需要连带 GD 库一起来编译 PHP。 GD 库和 PHP 可能需要其他的库, 这取决于你要处理的图像格式。

你可以使用 PHP 中的图像函数来获取下列格式图像的大小: JPEG, GIF, PNG, SWF, TIFF 和 JPEG2000。

如果联合 exif 扩展 一起使用, 你可以操作存储在 JPEG 和 TIFF 图像文件头部的信息, 这样就就可以获取数码相机所产生的元数据。 exif 相关的函数不需要 GD 库亦可使用。

GD库的使用方法

GD库是用来生成和处理图像的,使用GD库处理图像分为四个步骤:
1. 创建画布:画布的类似于我们在画画时使用的画布,画布可以是新创建的或者从图像文件读取的。
2. 处理图像:创建画布成功以后,就使用各种GD库函数处理图像了,可以设置图像的颜色、填充画布、画点、线段、各种几何图形,以及向图像中添加文本等。
3. 输出图像:处理完成后,可以将图片发送到浏览器或者保存到文件中。
4. 释放资源:这一步可以省略,因为php脚本结束后会自动释放资源

使用GD库生成图像验证码

生成图像验证码的步骤

  1. 创建新画布并填充背景色

  2. 添加图像中的干扰项,这些干扰项可以是圆弧、线条、点等

  3. 添加验证码内容, 这些内容一般是随机生成的四个数字或者字母

  4. 输出图像到浏览器,先使用header函数设置Content-Type通知浏览器发送的内容是图像,然后输出图像内容

  5. 释放资源,这步可以省略

代码例子

说的再多不如直接看代码,所以这里贴上代码例子:

<?php/**
 * 生成图像验证码
 * 可以通过GET方法传入width和height设置图片大小
 * 生成之后通过$_SESSION["vcode"]获取验证码
 * @author luoluozlb <643552878@qq.com> 2017/6/15
 */$width = 150;$height = 50;if(isset($_GET[&#39;width&#39;])){    $width = $_GET[&#39;width&#39;];
}if(isset($_GET[&#39;height&#39;])){    $height = $_GET[&#39;height&#39;];
}$fontSize = $height / 2;$fontFile = &#39;Monaco.ttf&#39;;  //字体文件位置//随机产生一个背景颜色(暗色)function RandomBackColor($imgSource){
    return imagecolorallocate($imgSource, mt_rand(0, 128), mt_rand(0, 128),  mt_rand(0, 128));
}//随机产生一个颜色(亮色)function RandomColor($imgSource){
    return imagecolorallocate($imgSource, mt_rand(100, 255), mt_rand(100, 255),  mt_rand(100, 255));
}$img = imagecreatetruecolor($width, $height); //创建画布imagefill($img, 0, 0, RandomBackColor($img));     //填充背景//添加一些干扰直线for($i = 0; $i < 3; ++ $i){
    imageline($img, mt_rand(0, $width), mt_rand(0, $height), mt_rand(0, $width), mt_rand(0, $height), RandomColor($img));
}//添加一些干扰弧线for($i = 0; $i < 3; ++ $i){
    imagearc($img, mt_rand(- $width, $width), mt_rand(- $height, $height), mt_rand(0, $width), mt_rand(0, $height), mt_rand(0, 360), mt_rand(0, 360), RandomColor($img));
} 

//添加一些干扰点for($i = 0; $i < 25; ++ $i){
    imagesetpixel($img, mt_rand(0,150), mt_rand(0,60), RandomColor($img));
}//生成验证码$codeRange = &#39;0123456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ&#39;; //验证码字符的取值范围$code = &#39;&#39;;for($i = 0, $len = strlen($codeRange); $i < 4; ++ $i){    //循环4次,就是有四个随机的字母或者数字   
    $code .= $codeRange[mt_rand(0, $len - 1)];
}//添加验证码到图像$x = 10;$dx = ($width - 10)/4;$y = $height - ($height - $fontSize)/2;for($i = 0; $i < 4; ++ $i){
    imagettftext($img, $fontSize, mt_rand(-15, 15), $x, $y, RandomColor($img), $fontFile, $code[$i]);    $x += $dx;
}

session_start();$_SESSION["vcode"] = $code;    //验证码保存到seesion中header("Content-Type: image/png");
imagepng($img);             // 输出图像imagedestroy($img);         // 销毁图像?>

在登录页面中使用图像验证码

把上面的生成验证码图像的php脚本命名为vcode.php,这里给出使用它的例子:

<?php$user = $password = $errmsg = &#39;&#39;;
if($_SERVER[&#39;REQUEST_METHOD&#39;] == &#39;POST&#39;){
    $user = $_POST[&#39;user&#39;];
    $password = $_POST[&#39;password&#39;];
    //验证用户名和密码
    //code...


    //验证验证码
    session_start();
    if(empty($_POST[&#39;vcode&#39;])){
        $errmsg = "请填写验证码!";
    }
    else{
        if(0 == strcasecmp($_POST[&#39;vcode&#39;], $_SESSION[&#39;vcode&#39;])){  //不区分大小写比较
            echo &#39;登录成功!&#39;;
            //header(&#39;location: index.php&#39;);  //跳转到首页
            exit();
        }else{
            $errmsg = "验证码错误!";
        }
    }
}?><!DOCTYPE html><html><head>
    <meta charset="UTF-8" />
    <title>用户登录</title></head><body>
    <p><?php echo $errmsg; ?></p>
    <form action="login.php" method="post">
        <table>
            <tr>
                <td><label for=&#39;user&#39;>用户名:</label></td>
                <td><input type=&#39;text&#39; name=&#39;user&#39; id=&#39;user&#39; value=&#39;<?php echo $user; ?>&#39; /></td>
            </tr>
            <tr>
                <td><label for=&#39;password&#39;>密码:</label></td>
                <td><input type=&#39;password&#39; name=&#39;password&#39; id=&#39;password&#39;  value=&#39;<?php echo $password; ?>&#39; /></td>
            </tr>
            <tr>
                <td><label for=&#39;vcode&#39;>验证码:</label></td>
                <td><input type=&#39;password&#39; name=&#39;vcode&#39; id=&#39;vcode&#39; /></td>
                <td><img src="vcode.php?width=100&height=35" alt="验证码"></td>
            </tr>
            <tr>
                <td><input type="submit" value=&#39;登录&#39;></td>
            </tr>
        </table>
    </form></body></html>

更多相关教程请访问 php编程从入门到精通全套视频教程

声明
本文转载于:CSDN博客。如有侵权,请联系admin@php.cn删除
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace("&nbsp;","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用