下面的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();" />