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 相关文章推荐
在Windows中安装Apache2和PHP4的权威指南
Oct 09 PHP
PHP个人网站架设连环讲(四)
Oct 09 PHP
php抓取https的内容的代码
Apr 06 PHP
PHP中几种常见的超时处理全面总结
Sep 11 PHP
Codeigniter实现智能裁剪图片的方法
Jun 12 PHP
getimagesize获取图片尺寸实例
Nov 15 PHP
php常用字符串比较函数实例汇总
Nov 24 PHP
新浪SAE搭建PHP项目教程
Jan 28 PHP
php实现简单的语法高亮函数实例分析
Apr 27 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
Oct 16 PHP
php使用PDO获取结果集的方法
Feb 16 PHP
php简单检测404页面的方法示例
Aug 23 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修改NetBeans默认字体的大小
2013/07/02 PHP
PHP内置过滤器FILTER使用实例
2014/06/25 PHP
php实现的RSS生成类实例
2015/04/23 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
用jquery存取照片的具体实现方法
2013/06/30 Javascript
js 对小数加法精度处理示例说明
2013/12/27 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
两种不同的方法实现js对checkbox进行全选和反选
2014/05/13 Javascript
javascript html实现网页版日历代码
2016/03/08 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
微信小程序报错:this.setData is not a function的解决办法
2017/09/27 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
JS中实现浅拷贝和深拷贝的代码详解
2019/06/05 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
2019/11/01 jQuery
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
Python生成器generator用法示例
2018/08/10 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
python通过链接抓取网站详解
2019/11/20 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
详解vscode实现远程linux服务器上Python开发
2020/11/10 Python
什么是Assembly(程序集)
2014/09/14 面试题
个人简历自我鉴定
2013/10/11 职场文书
优秀毕业生求职信
2014/06/05 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
2015年社区矫正工作总结
2015/04/21 职场文书
上下班时间调整通知
2015/04/23 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
python3.9之你应该知道的新特性详解
2021/04/29 Python