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

/****** 产生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);
?> 
(0)

相关推荐

  • PHP用星号隐藏部份用户名、身份证、IP、手机号等实例

    一.仿淘宝评论购买记录隐藏部分用户名,以下代码亲测可用. 复制代码 代码如下: function cut_str($string, $sublen, $start = 0, $code = 'UTF-8') {     if($code == 'UTF-8')     {         $pa = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\

  • PHP身份证校验码计算方法

    中国(大陆)公民身份证号码每一位所代表的意义,网上很多文章都有介绍,在此就不多说.其中身份证号码的最后一位是校验码,跟据前17位计算得到.算法大 概是这样:把前17位的每一个数字和一串加权因子相乘,再计算这些乘积的和:把这些乘积的和模11得到的数字作为序号,最后在一个校验码串中提取出与序号 相对应的字符.当然,网上也有不少的文章教大家计算这个校验码,下面我们将尝试用PHP语言来完成这一工作,也许可以用于PHP开发中,如校验用户的身份证号码是否正确. 假设某中国(大陆)公民的身份证号码前17位是这

  • PHP 身份证号验证函数

    复制代码 代码如下: function validation_filter_id_card($id_card) { if(strlen($id_card) == 18) { return idcard_checksum18($id_card); } elseif((strlen($id_card) == 15)) { $id_card = idcard_15to18($id_card); return idcard_checksum18($id_card); } else { return fa

  • php身份证号码检查类实例

    本文实例讲述了php身份证号码检查类.分享给大家供大家参考.具体如下: <?php class CIDMaker // 声明一个身份证号码检查类 { var $id; var $err; var $idx = array(1,1,1,1,1,1,1,1,3,1,1,2,2,2,3,2,2,2,2,2,2,2,3,3,3,3); var $idy = array(0,1,2,3,4,5,6,7,4,8,9,0,1,2,5,3,4,5,6,7,8,9,0,1,2,3); function check

  • php提取身份证号码中的生日日期以及验证是否为成年人的函数

    php 提取身份证号码中的生日日期以及确定是否成年的一个函数.可以同时确定15位和18位的身份证,经本人亲测,非常好用,分享函数代码如下: <?php //用php从身份证中提取生日,包括位和位身份证 function getIDCardInfo($IDCard){ $result['error']=;//:未知错误,:身份证格式错误,:无错误 $result['flag']='';//标示成年,标示未成年 $result['tdate']='';//生日,格式如:-- if(!eregi(&quo

  • php不用正则验证真假身份证

    直接看代码吧,很简单的一个PHP类 复制代码 代码如下: <?php $IDCard = new IDCard(); var_dump($IDCard::isCard($_GET['card']));   /**  * 身份证处理类  */ class IDCard {       //检证身份证是否正确     public static function isCard($card) {         $card = self::to18Card($card);         if (st

  • PHP用身份证号获取星座和生肖的方法

    复制代码 代码如下: <?php // PHP根据身份证号,自动获取对应的星座函数 function get_xingzuo($cid) { // 根据身份证号,自动返回对应的星座  if (!isIdCard($cid)) return '';  $bir = substr($cid,10,4);  $month = (int)substr($bir,0,2);  $day = (int)substr($bir,2);  $strValue = '';  if (($month == 1 &

  • php根据身份证号码计算年龄的实例代码

    复制代码 代码如下: <?php function getAgeByID($id){         //过了这年的生日才算多了1周岁         if(empty($id)) return '';         $date=strtotime(substr($id,6,8)); //获得出生年月日的时间戳         $today=strtotime('today'); //获得今日的时间戳         $diff=floor(($today-$date)/86400/365);

  • 使用php从身份证号中获取一系列线索(星座、生肖、生日等)

    本文第一个实例为大家分享了PHP根据身份证号,自动获取对应的星座函数,供大家参考,具体内容如下 <?php function get_xingzuo($cid) { // 根据身份证号,自动返回对应的星座 if (!isIdCard($cid)) return ''; $bir = substr($cid,10,4); $month = (int)substr($bir,0,2); $day = (int)substr($bir,2); $strValue = ''; if (($month =

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

    /****** 产生Session ID ******/ 基本的思路: 是把当前微秒的时间获取, 然后产生以个随机数字, 把随机数字和当前时间相加后加密一下, 最后再截取需要的长度 /* 函数名称:create_sess_id() 函数作用:产生以个随机的会话ID 参 数:$len: 需要会话字符串的长度,默认为32位,不要低于16位 返 回 值:返回会话ID 函数作者:heiyeluren */ function create_sess_id($len=32) { // 校验提交的长度是否合法

  • Android 二维码 生成和识别二维码 附源码下载

    今天讲一下目前移动领域很常用的技术--二维码.现在大街小巷.各大网站都有二维码的踪迹,不管是IOS.Android.WP都有相关支持的软件.之前我就想了解二维码是如何工作,最近因为工作需要使用相关技术,所以做了初步了解.今天主要是讲解如何使用ZXing库,生成和识别二维码.这篇文章实用性为主,理论性不会讲解太多,有兴趣可以自己查看源码. 1.ZXing库介绍 这里简单介绍一下ZXing库.ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口

  • java中ZXing 生成、解析二维码图片的小示例

    概述 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME.J2SE和Android. 官网:ZXing github仓库 实战 本例演示如何在一个非 android 的 Java 项目中使用 ZXing 来生成.解析二维码图片. 安装 maven项目只需引入依赖: <dependency> <groupId>com.google.zxing

  • vue+spring boot实现校验码功能

    本文实例为大家分享了vue+spring boot实现校验码功能的具体代码,供大家参考,具体内容如下 用vue写了一个校验码来玩玩,样子如下: 1.img标签 <img ="height:40px; width: 100px; cursor: pointer;" ref="imgIdentifyingCode" :src="selectedLogoPicture.imgUrl" class="logoImg" >

  • jQuery 生成svg矢量二维码

    jQuery 生成矢量svg二维码,并提供PNG,和SVG的页面下载,减轻服务端的压力. 代码如下所示: <html> <head> <title>jQuery 生成svg矢量二维码</title> </head> <body> <script type='text/javascript' src='http://cdn.staticfile.org/jquery/2.1.1/jquery.min.js'></scr

  • Android中二维码的生成方法(普通二维码、中心Logo 二维码、及扫描解析二维码)

    首先声明我们通篇用的都是Google开源框架Zxing,要实现的功能有三个 ,生成普通二维码.生成带有中心图片Logo 的二维码,扫描解析二维码,直接上效果图吧 首先我们需要一个这样的 Zxing 的包类似于这样 接下来需要引入资源 1.drawable 中引入图片 navbar.png 2.layout中引入camera.xml.main.xml.qrcode_capture_page.xml 3.创建raw文件夹并添加beep.ogg 扫描声音 4.合并color.xml,copy ids.

  • IOS生成与读取二维码名片

    一.概述 1.通过某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的 2.二维码通常可以包含以下内容 纯文本 名片 URL 3.二维码具有非常广泛的应用 二维码名片 扫码付款 网址(URL),扫描后自动打开网址 二.二维码的生成 1.生成原理 通过一个类CIFilter(滤镜)包含二维码中所有的信息,然后生成一张二维码图片 二维码中间的icon(头像),是通过在生成的图片上添加一张图片实现的 2.生成步骤 创建滤镜 初始化滤镜 添加二维码信息 获取生成的二维码

  • php生成带logo二维码方法小结

    一.使用的类库 1.phpqrcode(php库) 2.qrcode.js(javascript库) 二.phpqrcode的使用 只用php的类库,也就是二维码的生成在后台操作.因为要在后台生成带logo的二维码,那么首先必须将logo图片上传至服务器(在上传这里我用了webuploader) phpqrcode使用方法: 首先下载phpqrcode:http://phpqrcode.sourceforge.net/ 然后在使用之前记得引入phpqrcode.php文件 $value = $u

  • C#利用ZXing.Net生成条形码和二维码

    本文是利用ZXing.Net在WinForm中生成条形码,二维码的小例子,仅供学习分享使用,如有不足之处,还请指正. 什么是ZXing.Net? ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.而ZXing.Net是ZXing的端口之一. 在工程中引用ZXing.Net 在项目中,点击项目名称右键-->管理NuGet程序包,打开NuGet包管理器窗口,进行搜索下载即可,如下图所示: ZXing.Net关键类结构图 包括Reader[识

  • 微信小程序云开发 生成带参小程序码流程

    本文实例为大家分享了小程序生成带参小程序码的具体步骤,供大家参考,具体内容如下 生成带参小程序码流程 1.小程序端上传生成二维码所需的参数到云函数 2.云函数使用appid和appsecret请求access_token 3.云函数使用access_token + 小程序端上传的参数生成二维码 4.云函数将生成的二维码返回到小程序端(或者存到数据库返回fileID,小程序端用fileID进行获取,后续生成先在数据库查找,数据库没有再执行生成操作,防止重复生成小程序码文件) 小程序端上传小程序码所

随机推荐