当前位置: 首页 >> 程序设计 >> PHP源代码: 安全的验证码
 

PHP源代码: 安全的验证码

作者:      来源:zz     发表时间:2008-02-18     浏览次数:      字号:    

要是你载入背景图片,将更安全
/**
 * 验证码
 * @link http://lib.cublog.cn 转载请注明出处
 * @autor 流水孟春 cmpan(at)qq.com
 */

<?php

function confirmCode(){
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: post-check=0, pre-check=0', false);
    
    
// HTTP/1.0

    header('Pragma: no-cache');
            
    header("content-type: image/png");
            
    $length = isset($_GET['length']) ? $_GET['length'] : 4;
// 校验码长度/字符


    
// 生成校验码

    
//function confirmCode($length){

    $codeSet = '346789ABCDEFGHJKLMNPQRTUVWXY';
// 01IO容易混淆,不用

    $codeWave = 7;
// 验证码上线波动

    $imageX = mt_rand(1, 55);
// 左边距

    $imageY = mt_rand(1, 55) + $codeWave;
// 上边距

    $imageL = $imageX + $length*10 + 100;
// 图片宽度

    $imageH = $imageY + 100;
// 图片高度

    $noiseNum = 300*$length;
// 杂点数量

    $lineNum = 35;
// 干扰线数量


    
// 建立一幅 $imageL x $imageH 的图像

    $image = imagecreate($imageL, $imageH);
    $bg = imagecolorallocate($image, 255, 255, 255);
// 白色背景


    $rectangleColor = imagecolorallocate($image, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
// 边框颜色

    $noiseColor = imagecolorallocate($image, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
// 杂点颜色

    
    
//imagerectangle($image, 0, 0, $imageL-1, $imageH-1, $rectangleColor); // 添加边框

    
    
//加入干扰线    

    for($i=0; $i<$lineNum; $i++){
     $lineColor = imagecolorallocate($image, mt_rand(150,225), mt_rand(150,225), mt_rand(150,225));
//干扰线颜色

        imageline($image, mt_rand(1, $imageL - 50), mt_rand(1, $imageH - 30),    
         mt_rand(1, $imageL), mt_rand(1, $imageH), $lineColor);
        imagestring($image, 5, mt_rand(1,$imageL), mt_rand(1,$imageH), '*', $lineColor);
    }
    
    $code = '';
// 校验码

    $codeNX = 0;
// 校验码第N个字符的左边距

    for ($i = 0; $i<$length; $i++) {
        $code[$i] = $codeSet[mt_rand(0, 27)];
        $codeNX += 10 + mt_rand(0,30);
        imagestring($image, 5, $codeNX, $imageY+ mt_rand(-$codeWave, $codeWave),
        $code[$i], imagecolorallocate($image, mt_rand(1,180), mt_rand(1,200), mt_rand(1,200)));
// 把校验码写入图像

    }
    $_SESSION['confirmCode'] = join('', $code);
// 把校验码保存到session


    
//加入杂点

    for($i=0;$i<$noiseNum;$i++)
    imagesetpixel($image,mt_rand(1,$imageL),mt_rand(1,$imageH),imagecolorallocate($image,
     mt_rand(150,255), mt_rand(150,255), mt_rand(150,255)));
         
    imagepng($image);
// 输出图像

    imagedestroy($image);
}

 
==============================================================================
做了一些改进
==========》
<?php

/**
 * 验证码
 *
 * @author 流水孟春 cmpan(at)qq.com
 * @copyright GPL
 */


if($_GET['act'] == 'confirmCode') {
    confirmCode();
}
function confirmCode(){
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: post-check=0, pre-check=0', false);
    
    
// HTTP/1.0

    header('Pragma: no-cache');
            
    header("content-type: image/png");
            
    $length = isset($_GET['length']) ? $_GET['length'] : 4;
// 校验码长度/字符


    
// 生成校验码

    
//function confirmCode($length){

    $codeSet = '346789ABCDEFGHJKLMNPQRTUVWXY';
// 01IO容易混淆,不用

    $codeWave = 7;
// 验证码上线波动

    $imageX = mt_rand(1, 55);
// 左边距

    $imageY = mt_rand(1, 40) + $codeWave;
// 上边距

    $imageL = $imageX + $length*10 + 100;
// 图片宽度

    $imageH = $imageY + 30;
// 图片高度

    $noiseNum = 300*$length;
// 杂点数量

    $lineNum = 50;
// 干扰线数量


    
// 建立一幅 $imageL x $imageH 的图像

    $image = imagecreatetruecolor($imageL, $imageH);        
    $bgImg = 'images/confirumcode/background/background' . mt_rand(1,8) . '.jpg';
    $bg = imagecreatefromjpeg($bgImg);
    
    imagecopyresampled($image, $bg, 0, 0, mt_rand(0,10), mt_rand(0,10), $imageL, $imageH, 180, 70);
    
    
//imagerectangle($image, 0, 0, $imageL-1, $imageH-1, $rectangleColor); // 添加边框

    

    
    $code = '';
// 校验码

    $codeNX = 0;
// 校验码第N个字符的左边距

    for ($i = 0; $i<$length; $i++) {
        $code[$i] = $codeSet[mt_rand(0, 27)];
        $codeNX += 10 + mt_rand(0,30);
        imagestring($image, 5, $codeNX, $imageY+ mt_rand(0, $codeWave),
        $code[$i], imagecolorallocate($image, mt_rand(1,100), mt_rand(1,100), mt_rand(1,100)));
// 把校验码写入图像

    }
    $_SESSION['confirmCode'] = join('', $code);
// 把校验码保存到session


         
    imagepng($image);
// 输出图像

    imagedestroy($image);
}

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
评论内容只代表网友个人观点,与本网站立场无关。
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •