PHP生成图形验证码

在建站过程中,很多时候都会需要用户验证验证码等操作,比如:注册、登录、发表评论、获取资源等等,一方面可以验证当前用户的行为是否是爬虫、机器人等情况,给网站数据统计产生影响;另一方面可以防止用户大量刷取资源导致服务器资源紧张甚至宕机;现在验证码在表单中的应用越来越多了,但是如果用js来实现总觉得不太方便,因此可以使用php来实现。

测试地址:http://api.hmiwin.top/api/yzm.php
请求参数:num,text
参数说明:其中num是欲输出验证码的字符个数;text是欲输出验证码图片里面的内容

php源码如下:

<?php

//http://api.hmiwin.top/api/yzm.php

$num = $_GET['num'];
$text = $_GET['text'];
if($num=="")//如果num参数为空默认等于4
    $num = 4;

check_code(150, 50, $num ,$text);//调用,其中$num是欲输出验证码的字符个数,$text是欲输出验证码图片里面的内容

function check_code($width , $height , $num , $string ,$type = 'jpeg' ) {
    $img = imagecreate($width, $height);
    for ($i = 0; $i < $num; $i++) {
        $rand = mt_rand(0, 2);

        switch($rand) {
            case 0:
                $ascii = mt_rand(48, 57);
                break;
            case 1:
                $ascii = mt_rand(65, 90);
                break;
            case 2:
                $ascii = mt_rand(97, 122);
                break;
        }

        $string .= sprintf('%c', $ascii);
    }

    imagefilledrectangle($img, 0, 0, $width, $height, randBg($img));

    for ($i = 0; $i < 50; $i++) {
        imagesetpixel($img, mt_rand(0, $width), mt_rand(0, $height), randPix($img));
    }

    for ($i = 0; $i < $num; $i++) {
        $x = floor($width/$num) *$i + 2;
        $y = mt_rand(0, $height - 15);

        imagechar($img, 5, $x, $y, $string[$i], randPix($img));
    }

    $func = 'image' . $type;

    $header = 'content-type:image/' . $type;

    if (function_exists($func)) {
        header($header);
        $func($img);
    } else {
        exit('不支持');
    }

    imagedestroy($img);
    return $string;
}

function randBg($img) {
    return imagecolorallocate($img, mt_rand(130, 255), mt_rand(130, 255), mt_rand(130, 255));
}

function randPix($img) {
    return imagecolorallocate($img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
}
?>

欢迎转载,转载请申明来源地址!

Original: https://www.cnblogs.com/hmi1234/p/16184450.html
Author: Hmi1234
Title: PHP生成图形验证码

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/594618/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2 Java内存层面的对象认识

    1 对象的创建 2 对象的内存布局 3 对象的访问定位 3.1句柄访问 3.2 直接指针访问 说明:此分析基于HotSpot虚拟机 1 对象的创建 Java对象的创建方式有三种: …

    Java 2023年6月7日
    088
  • 华为暑期实习 通用软件开发 面经

    华为暑期实习 通用软件开发工程师 数据存储与机器视觉 面经 机试 7.6 第一题 字符串匹配 给五行英文句子,找出来其中的网址,网址以http或https开头,以com结尾,不要重…

    Java 2023年6月5日
    0110
  • Maven插件开发教程

    Maven是一个一个优秀的项目管理开源框架,其插件机制为其功能扩展提供了非常大的便捷性。大多数情况下,我们不需要自己开发Maven插件,因为Maven本身提供了很多便捷的官方插件。…

    Java 2023年6月8日
    087
  • Intellij IDEA 的maven项目 通过Java代码,实现 Jetty 的 Http服务器

    Jetty是一个轻量级的高度可扩展的基于 java的web服务器和servlet引擎。 下面是 使用 Intellij IDEA 的maven项目 通过Java代码,实现 Jett…

    Java 2023年5月29日
    085
  • npm 添加淘宝代理

    设置仓库npm config set registry https:# 查看代理结果npm config get registry# 解除网络代理npm config set pr…

    Java 2023年6月13日
    0118
  • PRINCE2系列一基于项目情境自定义解决方案

    PRINCE2(PRojects IN Controlled Environments,受控环境下的项目管理) 对项目进行了如下定义:项目是按照一个被批准的商业论证,为了交付一个或…

    Java 2023年6月16日
    081
  • 源码中的设计模式–模板方法模式(钩子方法)

    在上次《源码中的设计模式–模板方法模式》中分享了有关模板方法设计模式方面的东西,不知道还有印象没,重温下其释义, 模板方法模式在一个方法中定义一个算法的骨架,而将一些步…

    Java 2023年6月9日
    092
  • Redis做Mybatis的二级缓存

    基于spring boot项目的前提下,使用redis数据库做mybatis的二级缓存。 Redis做mybatis的二级缓存 作用提升速度,保证多台服务器访问同一数据库时不会崩注…

    Java 2023年6月14日
    072
  • Hystrix 断路器

    分布式系统面临的问题:复杂分布式体式结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失败。 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务…

    Java 2023年6月8日
    051
  • 访问Github速度很慢以及解决方法(系统通用)

    原因分析1,CDN,Content Distribute Network,可以直译成内容分发网络,CDN解决的是如何将数据快速可靠从源站传递到用户的问题。用户获取数据时,不需要直接…

    Java 2023年6月14日
    089
  • 来自Java程序员的Python新手入门小结

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kuberne…

    Java 2023年6月8日
    0107
  • 基本数据类型-java学习日记

    1.不同进制的数据组成 二进制: 由0,1组成。以0b开头 八进制: 由0,1,…7组成。以0开头 十进制:由0,1,…9组成。整数默认是十进制 十六进制:…

    Java 2023年6月5日
    0101
  • Spring AOP实现接口调用异常时重试

    调用某个接口时,可能因为数据同步延迟等原因导致抛异常,很希望程序可以重试指定次数后再结束运行。 注意:接口需配合事务,当抛异常时,进行回滚,以撤销异常之前对数据库的操作。 @Asp…

    Java 2023年6月8日
    084
  • 基因、人类和计算机-《自私的基因》读后感

    《自私的基因》是理查德·道金斯讲解基因的一本书,写于上个世纪70年代 前言中提到的内克尔立方体,寓意是告诉我们要以多角度看世界,七个习惯中的少女与老妇图也是相同的意思,正如本书中的…

    Java 2023年6月5日
    0100
  • 线程同步的情景之一

    从本篇文章开始,我将陆续介绍多线程中会遇到的三种情况。 情景一:此茅坑有主了 大锤:”我擦,居然一个茅坑有两个人在用。” 大锤:”啊,忍不住了,…

    Java 2023年5月30日
    077
  • 网络编程杂谈之TCP协议

    TCP协议属于网络分层中的传输层,传输层作用的就是建立端口与端口的通信,而其下一层网络层的主要作用是建立”主机到主机”的通信,所以在我们日常进行网络编程时只…

    Java 2023年6月9日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球