按 ‘ 验证码 ’ 标签归档

简单的验证码图片生成器

下面的PHP程序可以生成如  这样的简单验证码。把它存成一个PHP文件,例如captcha.php,使用<img src=’captcha.php’ />显示它,然后,你在服务器端把用户的输入和$_SESSION[‘captcha’]做比较即可:

<?php
    session_start();

    $charset = 'ABCDEFGHJKLMNPQRSTUVWXY3456789';
    $maxpos = strlen($charset) - 1;
    $captcha = '';
    $im = imagecreate(60, 24);
    $white = imagecolorallocate($im, 0xff, 0xff, 0xff);
    for ($i = 0; $i < 4; $i++) {
        $imchar = imagecreate(15, 24);
        $white = imagecolorallocate($imchar,mt_rand(0xe0, 0xff), mt_rand(0xe0, 0xff), mt_rand(0xe0, 0xff));
        $color = imagecolorallocate($imchar, mt_rand(0x00, 0x70), mt_rand(0x00, 0x70), mt_rand(0x00, 0x70));
        $captcha .= substr($charset, mt_rand(0, $maxpos), 1);
        imagestring($imchar, 5, 0, 0, $captcha[$i], $color);
        $imchar = imagerotate($imchar, mt_rand(-10, 10), $white);
        imagecopymerge($im, $imchar, mt_rand(1, 5) + $i * 15, mt_rand(0, 8), 0, 0, 15, 24, 100);
    }
    for ($i = 0; $i < 15; $i++) {
        $x1 = mt_rand(0, 59);
        $y1 = mt_rand(0, 23);
        $x2 = $x1 + mt_rand(-2, 2);
        $y2 = $y1 + mt_rand(-1, 1);
        imageline($im, $x1, $y1, $x2, $y2, mt_rand(0x000000, 0xffffff));
    }
    $_SESSION['captcha'] = $captcha;
    header('Content-type: image/gif');
    imagegif($im);
?>

使用的字符集里没有I、O、1、0、Z、2,因为担心它们互相混淆。思考:S和5是不是也挺像的?纠结。

为了让验证码有“看不清,换一个”的功能,现实中的<img>写得要稍微复杂些,下面代码里的’captcha.php?’+now.getTime()是为了欺骗浏览器,让它以为是一张新的图片进来了,强迫它刷新captcha.php产生的图片,而不是从缓存里获得:

<img src="captcha.php" title="click for a new one"
onclick="now=new Date();src='captcha.php?'+now.getTime();" />