"验证码用于屏蔽机器写入!!!"
目标:在底图上显示随机内容(如数字)
方法:init imagecolorallocate ( resource $image , int $red , int $green , int $blue)
bool imagestring ( resource $image , int $font , int $x , int $y , string $s ,
int $col)
注意事项:控制好字体与分布,避免字体重叠或显示不全
目标:为验证码增加干扰元素,干扰的点或线(两点确定一条线)
方法:bool imagesetpixel(resource $image,int $x,int $y,int $color)
bool imageline(resource $image,int $x1,int $y1,int $x2,int $y2,int $color)
注意事项:干扰信息一定控制好颜色,避免“喧宾夺主”
captcha.php:
<?php
//生成一张背景图片
$image = imagecreatetruecolor(100,30);//创建一个宽100高30的区域
$bgcolor = imagecolorallocate($image,255,255,255);//#ffffff
imagefill($image,0,0,$bgcolor);//附上颜色
//在底图上生成随机四个数字
for( $i = 0; $i < 4; $i++) {
$fontsize=6;
$fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));
$fontcontent=rand(0,9);
$x=( $i * 100 / 4 )+rand(5,10);//设置x、y轴区间
$y=rand(5,10);
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
//为底图添加干扰点
for( $i = 0; $i < 200; $i++) {
$pointcolor = imagecolorallocate( $image, rand(50,200), rand(50,200), rand(50,200));
imagesetpixel( $image, rand(1,99), rand(1, 29), $pointcolor);
}
//为底图添加干扰线
for( $i = 0; $i < 3; $i++) {
$linecolor = imagecolorallocate( $image, rand(80,220), rand(80,220));
imageline( $image, rand(1,99), rand(1,29), rand(1,99), rand(1,29), linecolor);
}
header("Content-type: text/html; charset=utf-8");//乱码问题
header('content-type:image/png');
imagepng($image);
//end
imagedestory($image);
目标:让图片上的验证码内容显示为字母,或数字、字母混合体
方法:int rand ( int $min, int $max )
mixed array_rand ( array $input [, int $num_req = 1] )
注意事项:N/A
for( $i = 0; $i < 4; $i++) {
$fontsize = 6;
$fontcolor = imagecolorallocate( $image, rand(0,120), rand(0,120),rand(0,120));
$data = 'abcdefghijklmnopqrstuvwxyz123456789';
$fontcontent = substr( $data,rand(0,strlen($data)-1), 1 );
$x=( $i * 100 / 4 )+rand(5,10);//设置x、y轴区间
$y=rand(5,10);
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
目标:再服务器端记录验证码信息,便于用户输入后做校验
方法:bool session_start ( void )
注意事项:1. session_start()必须处于脚本最顶部
2. 多服务器情况,需要考虑几种管理session信息
<?php
session_start();
$captch_code = '';
for( $i = 0; $i < 4; $i++) {
$fontsize = 6;
$fontcolor = imagecolorallocate( $image, rand(0,120), rand(0,120),rand(0,120));
$data = 'abcdefghijklmnopqrstuvwxyz123456789';
$fontcontent = substr( $data,rand(0,strlen($data)-1), 1 );
$x=( $i * 100 / 4 )+rand(5,10);//设置x、y轴区间
$y=rand(5,10);
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
//保存到session中指定字段里
$_SESSION['authcode'] = $captch_code;
目标:将已生成的验证码提供给用户,并校验用户验证码的正确性
方法:HTML<form>表单基础
注意事项:N/A
<?php
if(isset($_REQUEST['authcode']))
{
session_start();
//strtolower 转化为小写
if (strtolower($_REQUEST['authcode'])==$_SESSION['authcode'])
{
header('Content-type: text/html; charset=UTF8');
echo '<font color="#0000CC">输入正确</font>';
}
else{
header('Content-type: text/html; charset=UTF8');
echo '<font color="#CC0000"><b>输入错误</b></font>';
}
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>确认验证</title>
</head>
<body>
<form method="post" action="./form.php">
<p>验证码图片:<img id="captcha_img" border="1" src="./captcha.php?r=<?php echo rand();?>" width="100" height="30">
<a href="javascript:void(0)" onClick="document.getElementById('captcha_img').src='./captcha.php?r='+Math.random()">换一个?</a>
</p>
<p>请输入图片的内容:<input type="text" name="authcode" value=""/></p>
<p><input type="submit" value="提交" style="padding:6px 20px;"></p>
</form>
</body>
</html>
1. 增加可点击的“换一个”文案
2. 用js选取器选取验证码图片
3. 用js修改验证码图片地址(改src)
网友评论