解析dedeCMS验证码的实现代码


Posted in PHP onJune 07, 2013

如下所示:

<?php
$rndstring = '';
for($i=0; $i<4; $i++) $rndstring .= chr(mt_rand(65,90));
//如果支持GD,则绘图
if(function_exists("imagecreate"))
{
 //Firefox部份情况会多次请求的问题,5秒内刷新页面将不改变session
 $ntime = time();
 if(empty($_SESSION['dd_ckstr_last']) || empty($_SESSION['dd_ckstr']) || ($ntime - $_SESSION['dd_ckstr_last'] > 5))
 {
  $_SESSION['dd_ckstr'] = strtolower($rndstring);
  $_SESSION['dd_ckstr_last'] = $ntime;
 }
 $rndstring = $_SESSION['dd_ckstr'];
 $rndcodelen = strlen($rndstring);
 //创建图片,并设置背景色
 $im = imagecreate(50,20);
 ImageColorAllocate($im, 255,255,255);
 //背景线
 $lineColor1 = ImageColorAllocate($im,240,220,180);
 $lineColor2 = ImageColorAllocate($im,250,250,170);
 for($j=3;$j<=16;$j=$j+3)
 {
  imageline($im,2,$j,48,$j,$lineColor1);
 }
 for($j=2;$j<52;$j=$j+(mt_rand(3,6)))
 {
  imageline($im,$j,2,$j-6,18,$lineColor2);
 }
 //画边框
 $bordercolor = ImageColorAllocate($im, 0x99,0x99,0x99);
 imagerectangle($im, 0, 0, 49, 19, $bordercolor);
 //输出文字
 $fontColor = ImageColorAllocate($im, 48,61,50);
 for($i=0;$i<$rndcodelen;$i++)
 {
  $bc = mt_rand(0,1);
  $rndstring[$i] = strtoupper($rndstring[$i]);
  imagestring($im, 5, $i*10+6, mt_rand(2,4), $rndstring[$i], $fontColor);
 }
 header("Pragma:no-cache/r/n");
 header("Cache-Control:no-cache/r/n");
 header("Expires:0/r/n");
 //输出特定类型的图片格式,优先级为 gif -> jpg ->png
 if(function_exists("imagejpeg"))
 {
  header("content-type:image/jpeg/r/n");
  imagejpeg($im);
 }
 else
 {
  header("content-type:image/png/r/n");
  imagepng($im);
 }
 ImageDestroy($im);
 exit();
}
else
{
 //不支持GD,只输出字母 ABCD
 $_SESSION['dd_ckstr'] = "abcd";
 $_SESSION['dd_ckstr_last'] = '';
 header("content-type:image/jpeg/r/n");
 header("Pragma:no-cache/r/n");
 header("Cache-Control:no-cache/r/n");
 header("Expires:0/r/n");
 $fp = fopen("data/vdcode.jpg","r");
 echo fread($fp,filesize("data/vdcode.jpg"));
 fclose($fp);
 exit();
}
?>

 

PHP 相关文章推荐
解析php中的escape函数
Jun 29 PHP
thinkphp模板输出技巧汇总
Nov 24 PHP
php使用str_replace实现输入框回车替换br的方法
Nov 24 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
Mar 04 PHP
thinkphp自定义权限管理之名称判断方法
Apr 01 PHP
php实现页面纯静态的实例代码
Jun 21 PHP
PHP微信模板消息操作示例
Jun 29 PHP
阿里云PHP SMS短信服务验证码发送方法
Jul 11 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 PHP
YII2框架中日志的配置与使用方法实例分析
Mar 18 PHP
探讨php中header的用法详解
Jun 07 #PHP
php简单浏览目录内容的实现代码
Jun 07 #PHP
php之XML转数组函数的详解
Jun 07 #PHP
利用php绘制饼状图的实现代码
Jun 07 #PHP
PHP自定义大小验证码的方法详解
Jun 07 #PHP
如何用php生成扭曲及旋转的验证码图片
Jun 07 #PHP
利用php获取服务器时间的实现代码
Jun 07 #PHP
You might like
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
php-msf源码详解
2017/12/25 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
javascript学习总结之js使用技巧
2015/09/02 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
Sea.JS知识总结
2016/05/05 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
Vue学习之常用指令实例详解
2020/01/06 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
Python lambda和Python def区别分析
2014/11/30 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
python绘制圆柱体的方法
2018/07/02 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
英国最大的在线奢侈手表零售商:Jura Watches
2018/01/29 全球购物
计算机本科生自荐信
2013/10/15 职场文书
超市业务员岗位职责
2013/12/05 职场文书
合伙购房协议样本
2014/10/06 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
2014年工会工作总结
2014/11/12 职场文书
家长会主持词开场白
2015/05/29 职场文书
健康证明
2015/06/19 职场文书
求职自荐信该如何书写?
2019/06/24 职场文书
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers