php生成SessionID和图片校验码的思路和实现代码


Posted in PHP onMarch 10, 2009
/****** 产生Session ID ******/ 
基本的思路: 是把当前微秒的时间获取, 然后产生以个随机数字, 把随机数字和当前时间相加后加密一下, 最后再截取需要的长度 
/* 
函数名称:create_sess_id() 
函数作用:产生以个随机的会话ID 
参 数:$len: 需要会话字符串的长度,默认为32位,不要低于16位 
返 回 值:返回会话ID 
函数作者:heiyeluren 
*/ 
function create_sess_id($len=32) 
{ 
// 校验提交的长度是否合法 
if( !is_numeric($len) || ($len>32) || ($len<16)) { return; } 
// 获取当前时间的微秒 
list($u, $s) = explode(' ', microtime()); 
$time = (float)$u + (float)$s; 
// 产生一个随机数 
$rand_num = rand(100000, 999999); 
$rand_num = rand($rand_num, $time); 
mt_srand($rand_num); 
$rand_num = mt_rand(); 
// 产生SessionID 
$sess_id = md5( md5($time). md5($rand_num) ); 
// 截取指定需要长度的SessionID 
$sess_id = substr($sess_id, 0, $len); 
return $sess_id; 
} 


/****** 产生校验码 ******/ 
思路: 这个思路比较简单,因为考虑独一无二和随机性,我们的校验码就Session ID里面截取一段字符串就可以了,因为我们的SessionID是充分考虑了独一无二的。 

/* 
函数名称:create_check_code() 
函数作用:产生以个随机的校验码 
参 数:$len: 需要校验码的长度, 请不要长于16位,缺省为4位 
返 回 值:返回指定长度的校验码 
函数作者:heiyeluren 
*/ 
function create_check_code($len=4) 
{ 
if ( !is_numeric($len) || ($len>6) || ($len<1)) { return; } 

$check_code = substr(create_sess_id(), 16, $len ); 
return strtoupper($check_code); 
} 


/****** 生成校验码的图片 ******/ 

这个就是一些比较简单的PHP图像编程的东西了,我作的图片和简单。 

/* 
函数名称:create_check_image() 
函数作用:产生一个校验码的图片 
参 数:$check_code: 校验码字符串,一般由create_check_code()函数来获得 
返 回 值:返回该图片 
函数作者:heiyeluren 
*/ 
function create_check_image( $check_code ) 
{ 
// 产生一个图片 
$im = imagecreate(65,22); 
$black = ImageColorAllocate($im, 0,0,0); // 背景颜色 
$white = ImageColorAllocate($im, 255,255,255); // 前景颜色 
$gray = ImageColorAllocate($im, 200,200,200); 
imagefill($im,68,30,$gray); 

// 将四位整数验证码绘入图片 
imagestring($im, 5, 8, 3, $check_code, $white); 
// 加入干扰象素 
for($i=0;$i<200;$i++) 
{ 
$randcolor = ImageColorallocate($im,rand(0,255),rand(0,255),rand(0,255)); 
imagesetpixel($im, rand()%70 , rand()%30 , $randcolor); 
} 
// 输出图像 
Header("Content-type: image/PNG"); 
ImagePNG($im); 
ImageDestroy($im); 
} 

这里我们要注意,引用create_check_image()函数的时候,必须在一个单独的文件里,因为输出文件头的时候输出的格式是图像格式,夹杂其他内容,会导致图片无法显示。另外,图片成生函数,你是可以更改的,比如你想改颜色,那么你就把前景色和背景色的生成位置换一下,那么颜色就不一样了,同时也要把校验码的颜色换了,不然背景和校验码都是黑色就显示不出来了。

PHP校验码生成--备忘

<?php 
session_start();//保存生成值,以与用户输入比较
//-------------------------------------------------------------------------
$img_w    = 80;// 设置图片宽
$img_h    = 20;// 设置图片高
$pixel_num  = 200;//点越多干扰越大
$is_set_line = true;// 启用干扰线
$pixel_mode = 2;// 干扰点模式,1,同色;2,杂色
//-------------------------------------------------------------------------

// 随机数产生器
function make_seed()
{
  list($usec, $sec) = explode(' ', microtime());
  return (float) $sec + ((float) $usec * 100000);
}
mt_srand(make_seed());//4.2.0以下版本适用
$authnum = mt_rand(100, 99999);
// 加入session
$_SESSION['verifycode']=$authnum;
//echo $authnum;

//生成验证码图片
Header("Content-type: image/PNG");
$im = imagecreatetruecolor($img_w, $img_h);

$bg_color = ImageColorAllocate($im, mt_rand(250,255),mt_rand(250,255),mt_rand(250,255));

// 绘制背景
imagefill($im,0,0,$bg_color);

$total_width = 0;
$word_info = array();

// 循环,获取文字信息
$word_length = strlen($authnum);
for($ii=0; $ii<$word_length; $ii++)
{
  $word_space = mt_rand(1,5);
  $font = rand(3,5);
  mt_rand(1,9)%2 == 0?$top = 1:$top = 3;
  $word_info[$ii]['char']  = substr($authnum,$ii,1);
  $word_info[$ii]['font']  = $font;
  $word_info[$ii]['offset'] = $top;
  if($ii == 0)
  {
    $word_info[$ii]['width'] = 0;
  }
  $word_info[$ii]['width'] = imageFontWidth($font)+$word_space;
  $word_info[$ii]['height'] = imageFontHeight($font);
  $word_info[$ii]['color'] = imageColorAllocate($im, mt_rand(0,50),mt_rand(0,150),mt_rand(0,200));

  // 文字总宽度
  $total_width += $word_info[$ii]['width'];

  // 取第一个字体的高度
  if($ii == 0)
  {
    $total_height = imagefontHeight($font);
  }
}

// 计算偏移
$offset_x = floor(($img_w - $total_width)/2);
$offset_y = floor(($img_h - $total_height)/2);

// 填充验证码
$wid = 0;
$i = 0;
foreach($word_info as $key=>$val)
{
  if($i>0)
  {
    $wid += $val['width'];
  }
  imagestring($im, $val['font'], $offset_x + $wid, $val['offset'] + $offset_y, $val['char'], $val['color']);
  $i++;
}
switch($pixel_mode)
{
  case 1:
    $pixel_color = ImageColorAllocate($im,
                    mt_rand(50,255),
                    mt_rand(50,255),
                    mt_rand(50,255));
    // 干扰象素
    for($i=0;$i<$pixel_num;$i++)
    {
      imagesetpixel($im, mt_rand()%$img_w , mt_rand()%$img_h , $pixel_color);
    }
    break;
  case '2':
    // 干扰象素
		for ($i=0;$i<=128;$i++)
		 {
		 $pixel_color = imagecolorallocate ($im, rand(0,255), rand(0,255), rand(0,255));
		 imagesetpixel($im,mt_rand(2,128),mt_rand(2,38),$pixel_color);
		 }
    break;

  default:
    $pixel_color = ImageColorAllocate($im,
                    mt_rand(50,255),
                    mt_rand(50,255),
                    mt_rand(50,255));
    // 干扰象素
    for($i=0;$i<$pixel_num;$i++)
    {
      imagesetpixel($im, mt_rand()%$img_w , mt_rand()%$img_h , $pixel_color);
    }
    break;
}
ImagePNG($im);
?>
PHP 相关文章推荐
用PHP中的 == 运算符进行字符串比较
Nov 26 PHP
php 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
Mar 23 PHP
php启用zlib压缩文件的配置方法
Jun 12 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
Jul 28 PHP
php is_executable判断给定文件名是否可执行实例
Sep 26 PHP
php 函数使用可变数量的参数方法
May 02 PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 PHP
php 生成加密公钥加密私钥实例详解
Jun 16 PHP
PHP实现微信退款的方法示例
Mar 26 PHP
laravel返回统一格式错误码问题
Nov 04 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 PHP
php 数组的创建、调用和更新实现代码
Mar 09 #PHP
在JavaScript中调用php程序
Mar 09 #PHP
隐性调用php程序的方法
Mar 09 #PHP
php动态生成JavaScript代码
Mar 09 #PHP
Zend 输出产生XML解析错误
Mar 03 #PHP
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
Mar 03 #PHP
php Try Catch异常测试
Mar 01 #PHP
You might like
php程序效率优化的一些策略小结
2010/07/17 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
基于PHP文件操作的详解
2013/06/05 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
php实现简单的上传进度条
2015/11/17 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
Js sort排序使用方法
2011/10/17 Javascript
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
jquery右下角自动弹出可关闭的广告层
2015/05/08 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
Jquery AJAX POST与GET之间的区别详细介绍
2016/10/17 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
2016/10/21 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
2019/11/14 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
全网小程序接口请求封装实例代码
2020/11/06 Javascript
Python实现的HTTP并发测试完整示例
2020/04/23 Python
python中偏函数partial用法实例分析
2015/07/08 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
c/c++某大公司的两道笔试题
2014/02/02 面试题
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
打架检讨书2000字
2014/02/22 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
贷款承诺书范文
2014/05/19 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python