/**

* 安全的验证码要:验证码文字扭曲、旋转,使用不同字体,添加干扰码。

* @原作者: 流水孟春

* @修 改: flymorn

**/

class YL_Security_Secoder {

//验证码的session的下标

public static $seKey = 'verify_py'; //验证码关键字

public static $expire = 3000; // 验证码过期时间(s)

//验证码中使用的字符,01IO容易混淆,不用

public static $codeSet = '3456789ABCDEFGHJKLMNPQRTUVWXY';

public static $fontSize = 26; // 验证码字体大小(px)

public static $useCurve = true; // 是否画混淆曲线

public static $useNoise = true; // 是否添加杂点

public static $imageH = 0; // 验证码图片宽

public static $imageL = 0; // 验证码图片长

public static $length = 4; // 验证码位数

public static $bg = array(243, 251, 254); // 背景

protected static $_image = null; // 验证码图片实例

protected static $_color = null; // 验证码字体颜色

/**

* 输出验证码并把验证码的值保存的session中

*/

public static function entry() {

// 图片宽(px)

self::$imageL || self::$imageL = self::$length * self::$fontSize * 1.5 + self::$fontSize*1.5;

// 图片高(px)

self::$imageH || self::$imageH = self::$fontSize * 2;

// 建立一幅 self::$imageL x self::$imageH 的图像

self::$_image = imagecreate(self::$imageL, self::$imageH);

// 设置背景

imagecolorallocate(self::$_image, self::$bg[0], self::$bg[1], self::$bg[2]);

// 验证码字体随机颜色

self::$_color = imagecolorallocate(self::$_image, mt_rand(1,120), mt_rand(1,120), mt_rand(1,120));

// 验证码使用随机字体,保证目录下有这些字体集

$ttf = dirname(__FILE__) . '/ttfs/t' . mt_rand(1, 10) . '.ttf';

if (self::$useNoise) {

// 绘杂点

self::_writeNoise();

}

if (self::$useCurve) {

// 绘干扰线

self::_writeCurve();

}

// 绘验证码

$code = array(); // 验证码

$codeNX = 0; // 验证码第N个字符的左边距

for ($i = 0; $i<:>

$code[$i] = self::$codeSet[mt_rand(0, 28)];

$codeNX += mt_rand(self::$fontSize*1.2, self::$fontSize*1.6);

// 写一个验证码字符

imagettftext(self::$_image, self::$fontSize, mt_rand(-40, 70), $codeNX, self::$fontSize*1.5, self::$_color, $ttf, $code[$i]);

}

// 保存验证码

isset($_SESSION) || session_start();

$_SESSION[self::$seKey]['code'] = join('', $code); // 把验证码保存到session, 验证时注意是大写

$_SESSION[self::$seKey]['time'] = time(); // 验证码创建时间

header('Pragma: no-cache');

header("content-type: image/JPEG");

// 输出图像

imageJPEG(self::$_image);

imagedestroy(self::$_image);

}

/**

* 画一条由两条连在一起构成的随机正弦函数曲线作干扰线(你可以改成更帅的曲线函数)

* 正弦型函数解析式:y=Asin(ωx+φ)+b

* 各常数值对函数图像的影响:

* A:决定峰值(即纵向拉伸压缩的倍数)

* b:表示波形在Y轴的位置关系或纵向移动距离(上加下减)

* φ:决定波形与X轴位置关系或横向移动距离(左加右减)

* ω:决定周期(最小正周期T=2π/∣ω∣)

*/

protected static function _writeCurve() {

$A = mt_rand(1, self::$imageH/2); // 振幅

$b = mt_rand(-self::$imageH/4, self::$imageH/4); // Y轴方向偏移量

$f = mt_rand(-self::$imageH/4, self::$imageH/4); // X轴方向偏移量

$T = mt_rand(self::$imageH*1.5, self::$imageL*2); // 周期

$w = (2* M_PI)/$T;

$px1 = 0; // 曲线横坐标起始位置

$px2 = mt_rand(self::$imageL/2, self::$imageL * 0.667); // 曲线横坐标结束位置

for ($px=$px1; $px<=$px2; $px=$px+ 0.9) {

if ($w!=0) {

$py = $A * sin($w*$px + $f)+ $b + self::$imageH/2; // y = Asin(ωx+φ) + b

$i = (int) ((self::$fontSize - 6)/4);

while ($i > 0) {

imagesetpixel(self::$_image, $px + $i, $py + $i, self::$_color);

//这里画像素点比imagettftext和imagestring性能要好很多

$i--;

}

}

}

$A = mt_rand(1, self::$imageH/2); // 振幅

$f = mt_rand(-self::$imageH/4, self::$imageH/4); // X轴方向偏移量

$T = mt_rand(self::$imageH*1.5, self::$imageL*2); // 周期

$w = (2* M_PI)/$T;

$b = $py - $A * sin($w*$px + $f) - self::$imageH/2;

$px1 = $px2;

$px2 = self::$imageL;

for ($px=$px1; $px<=$px2; $px=$px+ 0.9) {

if ($w!=0) {

$py = $A * sin($w*$px + $f)+ $b + self::$imageH/2; // y = Asin(ωx+φ) + b

$i = (int) ((self::$fontSize - 8)/4);

while ($i > 0) {

imagesetpixel(self::$_image, $px + $i, $py + $i, self::$_color);

//这里(while)循环画像素点比imagettftext和imagestring用字体大小一次画出

//的(不用while循环)性能要好很多

$i--;

}

}

}

}

/**

* 画杂点

* 往图片上写不同颜色的字母或数字

*/

protected static function _writeNoise() {

for($i = 0; $i < 10; $i++){

//杂点颜色

$noiseColor = imagecolorallocate(

self::$_image,

mt_rand(150,225),

mt_rand(150,225),

mt_rand(150,225)

);

for($j = 0; $j < 5; $j++) {

// 绘杂点

imagestring(

self::$_image,

5,

mt_rand(-10, self::$imageL),

mt_rand(-10, self::$imageH),

self::$codeSet[mt_rand(0, 28)], // 杂点文本为随机的字母或数字

$noiseColor

);

}

}

}

}

//调用上面定义的验证码类 来生产验证码

YL_Security_Secoder::$useNoise = true; //是否启用噪点

YL_Security_Secoder::$useCurve = true; //是否启用干扰曲线

YL_Security_Secoder::entry();

?>

还有一个tts的文件夹用于放字体文件

注册与验证码php源代码,PHP验证码处理源代码相关推荐

  1. 重构客户注册-基于ActiveMQ实现短信验证码生产者

    重构目标:将bos_fore项目中的CustomerAction作为短信消息生产者,将消息发给ActiveMQ,创建一个单独的SMS项目,作为短信息的消费者,从ActiveMQ获取短信消息,调用第三方 ...

  2. 用户在网站注册,网站通过微信发送验证码,这个操作是怎么实现的?

    根据我的观察: 1. 首先他们搞了一个渠道二维码(也就是微信说的带参数的二维码,而且他们用的是永久型的,市面上也叫渠道二维码) 2. 用户扫描这个二维码,后台程序得到event,在数据库里面生成一个随 ...

  3. gitee注册新用户收不到验证码, 不管是手机还是邮箱都收不到验证码解决方案

    gitee码云注册新用户收不到验证码, 不管是手机还是邮箱都收不到验证码解决方案题 真的是气死我了, 搞了两三个小时, 不管是手机注册还是邮箱注册还是第三方登录我都收不到注册处所需的验证码, 如下图. ...

  4. 某注册页面存在手机短信验证码绕过

    某注册页面存在手机短信验证码绕过的情况 关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭 ...

  5. 直播app源代码,验证码输入页面

    直播app源代码,验证码输入页面相关的代码 VerifyCodeActivity.java 主页面 public class VerifyCodeActivity extends BaseActivi ...

  6. 快速集成APP注册页面免费获取短信验证码功能

    前言: 最近这段时间都忙着优化自己的个人项目,好久没来总结分享了,今天就抽空跟大家分享一下快速集成APP注册页面免费获取短信验证码功能吧. 一.使用第三方短信SDK前期准备: 在这里我是使用了第三方免 ...

  7. 最新注册gmail邮箱收不到验证码解决方法

    最新注册gmail邮箱收不到验证码解决方法 最近因为要注册ChatGPT所以需要准备一个邮箱,我个人是非常喜欢使用gmail邮箱的,非常方便,注册一个gmail邮箱就相当于是注册了一整个谷歌生态,一个 ...

  8. python制作验证码_Python编写生成验证码的脚本的教程

    在web开发中经常用到验证码,为了防止机器人注册或者恶意登陆和查询等,作用不容小觑 但是验证码其实不是一个函数就能搞定的,它需要生成图片和水印,其实每种语言都有相关的函数生成图片和文字水印.包括我熟悉 ...

  9. php点击验证码,用PHP实现验证码功能

    作者:hutuworm 来源:糊涂馋寺 牐犇壳埃不少网站为了防止用户利用机器人自动注册.登录.灌水,都采用了 验证码技术.所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片, 图片里加上一些干扰 ...

最新文章

  1. 参加java培训真的能学到有用的吗
  2. python随机画散点图-Python使用Plotly绘图工具,绘制散点图、线形图
  3. python中使用tab键进行提示(python3有效)
  4. 分治:分治和动态规划的区别,二分检索递归和迭代方式实现
  5. 转:C# Interview Questions
  6. Windows下运行jekyll,编码已不再是问题
  7. 线程组之间的JMeter传递变量
  8. puppet 横向扩展(三)
  9. python编程入门第3版pdf-Python编程入门第3版PDF电子书免费下载
  10. Java集合类之Collection接口学习
  11. 基于Web的动态新闻发布系统设计与实现(含word文档)
  12. (精华2020年5月4日更新) vue教程篇 axio的使用
  13. 小宝精灵-智能语音遥控伴侣(套装版)测评-遥控器的语音时代
  14. 32位服务器系统安装教程,服务器系统数据库安装教程
  15. 前端重新学习(17)DOM 扩展
  16. 什么是IOC和什么是AOP
  17. 使用U盘安装 mac os
  18. bzoj3585 mex
  19. Python中print(f‘***‘)中f是什么意思
  20. 熊瞎子错把虎斑猫看成老虎

热门文章

  1. Linux-SAMBA服务器的配置
  2. crontab执行脚本中文乱码,手动执行没有问题
  3. linux shell base64 加解密 编码字符串
  4. linux expect 自动交互命令 总结
  5. docker 无法正常启动 解决方法
  6. golang 数据库 连接与连接池
  7. 安全研究人员最爱的12款Linux发行版
  8. golang RSA base64 加解密 签名验签
  9. docker部署openvas
  10. 读《Linux内核设计与实现》我想到了这些书