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 相关文章推荐
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
Apr 18 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
May 07 PHP
mysql,mysqli,PDO的各自不同介绍
Sep 19 PHP
解决PHP超大文件下载,断点续传下载的方法详解
Jun 06 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
PHP比你想象的好得多
Nov 27 PHP
php中实现获取随机数组列表的自定义函数
Apr 02 PHP
wampserver改变默认网站目录的办法
Aug 05 PHP
php多线程实现方法及用法实例详解
Oct 26 PHP
Zend Framework基本页面布局分析
Mar 19 PHP
PHPMailer发送邮件
Dec 28 PHP
一文看懂PHP进程管理器php-fpm
Jun 01 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
eaglephp使用微信api接口开发微信框架
2014/01/09 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
Javascript与PHP验证用户输入URL地址是否正确
2014/10/09 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
php 常用的系统函数
2017/02/07 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
用js实现in_array的方法
2013/11/05 Javascript
不提示直接关闭网页窗口的JS示例代码
2013/12/17 Javascript
JQuery+Ajax无刷新分页的实例代码
2014/02/08 Javascript
再探JavaScript作用域
2014/09/24 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
微信小程序实现简单评论功能
2018/11/28 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
jQuery实现本地存储
2020/12/22 jQuery
[02:24]DOTA2亚洲邀请赛 NAVI战队出场宣传片
2015/02/07 DOTA
Python with的用法
2014/08/22 Python
python base64 decode incorrect padding错误解决方法
2015/01/08 Python
python根据出生日期获得年龄的方法
2015/03/31 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
Python-openCV读RGB通道图实例
2020/01/17 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
Canvas图片分割效果的实现
2019/07/29 HTML / CSS
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
在C#中如何实现多态
2014/07/02 面试题
中医药大学市场营销专业自荐信
2013/09/29 职场文书
2014年应届大学生自我评价
2014/01/09 职场文书
投资合作协议书
2014/04/17 职场文书
护士长竞聘演讲稿
2014/04/30 职场文书
导游词欢迎词
2015/02/02 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书