博客首页 注册 建议与交流 排行榜 加入友情链接         宝宝相册的专门空间
推荐 投诉 搜索: 帮助

流水孟春

以前使用的博客 webvista.cublog.cn
lib.cublog.cn
原创安全的验证码

要是你载入背景图片,将更安全
/**
 * 验证码
 * @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);
}

发表于: 2007-09-18,修改于: 2007-10-23 15:28,已浏览706次,有评论0条 推荐 投诉

给我留言
版权所有 ChinaUnix.net 页面生成时间:0.00939