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 XMLWriter类的简单示例代码(RSS输出)
Sep 30 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
Apr 26 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
PHP中把数据库查询结果输出为json格式简单实例
Apr 09 PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 PHP
PHP实现的进度条效果详解
May 03 PHP
简单实现php上传文件功能
Sep 21 PHP
phpStudy 2016 使用教程详解(支持PHP7)
Oct 18 PHP
PHP利用百度ai实现文本和图片审核
May 08 PHP
php使用json-schema模块实现json校验示例
Sep 28 PHP
Laravel框架Eloquent ORM删除数据操作示例
Dec 03 PHP
php中array_fill函数的实例用法
Mar 02 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学习教程之第1天
2008/06/15 PHP
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
PHP中配置IIS7实现基本身份验证的方法
2015/09/24 PHP
详解Yii实现分页的两种方法
2017/01/14 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
一个基于jquery的图片切换效果
2010/07/06 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
Vue实现拖放排序功能的实例代码
2019/07/08 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
JS实现音量控制拖动
2020/01/15 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
Python深入学习之上下文管理器
2014/08/31 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
详解Python验证码识别
2016/01/25 Python
PyTorch快速搭建神经网络及其保存提取方法详解
2018/04/28 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
python跳出双层for循环的解决方法
2019/06/24 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
python安装gdal的两种方法
2019/10/29 Python
浅谈Python类中的self到底是干啥的
2019/11/11 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
阿根廷旅游网站:almundo阿根廷
2018/02/12 全球购物
荟萃全球保健品:维他购
2018/05/09 全球购物
《草原》教学反思
2014/02/15 职场文书
药学职务聘任书
2014/03/29 职场文书
先进学校事迹材料
2014/12/30 职场文书
求职信:会计求职的写作技巧
2019/04/24 职场文书
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python