理论分析


1、实现验证码底图

$image = imagecreatetruecolor(100,300);
// 为一副图像分配颜色
$bgcolor = imagecolorallocate($image,255,255,255);
// 为区域填充颜色
imagefill($image,0,0,$bgcolor);
header('Content-type: image/png'); // 提前输出图片header信息
imagepng($image); // 浏览器输出图片
imagedestory($image); // 销毁资源
// output 浏览器输出白色的图片
2、实现数字验证码

$image = imagecreatetruecolor(100,300);
// 为一副图像分配颜色
$bgcolor = imagecolorallocate($image,255,255,255);
// 为区域填充颜色
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); // 第i个数字的x坐标
$y = rand(5,10); // 第i个数字的y坐标
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
header('Content-type: image/png'); // 提前输出图片header信息
imagepng($image); // 浏览器输出图片
imagedestory($image); // 销毁资源
输出

3、增加干扰元素

(1)、追加干扰点
$image = imagecreatetruecolor(100,300);
// 为一副图像分配颜色
$bgcolor = imagecolorallocate($image,255,255,255);
// 为区域填充颜色
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); // 第i个数字的x坐标
$y = rand(5,10); // 第i个数字的y坐标
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);
}
header('Content-type: image/png'); // 提前输出图片header信息
imagepng($image); // 浏览器输出图片
imagedestory($image); // 销毁资源
输出

(2)、追加干扰线
$image = imagecreatetruecolor(100,300);
// 为一副图像分配颜色
$bgcolor = imagecolorallocate($image,255,255,255);
// 为区域填充颜色
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); // 第i个数字的x坐标
$y = rand(5,10); // 第i个数字的y坐标
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),rand(80,220)); // 干扰线颜色
imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
}
header('Content-type: image/png'); // 提前输出图片header信息
imagepng($image); // 浏览器输出图片
imagedestory($image); // 销毁资源
输出

4、实现字母数字混合验证码

<?php
/**
* Created by PhpStorm.
* User: zhengjiayuan
* Date: 2018/7/15
* Time: 22:19
*/
$image = imagecreatetruecolor(100,300);
// 为一副图像分配颜色
$bgcolor = imagecolorallocate($image,255,255,255);
// 为区域填充颜色
imagefill($image,0,0,$bgcolor);
// 加入4个字母数字混合
for($i=0;$i<4;$i++){
$fontsize=6; // 数字大小
$fontcolor = imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120)); // 数字颜色
$data= 'abcdefghijkmnpqrstuvwxy3456789';
$fontcontent = substr($data,rand(0,strlen($data)),1);
$x = ($i*100/4) + rand(5,10); // 第i个字符的x坐标
$y = rand(5,10); // 第i个字符的y坐标
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),rand(80,220)); // 干扰线颜色
imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
}
header('Content-type: image/png'); // 提前输出图片header信息
imagepng($image); // 浏览器输出图片
imagedestory($image); // 销毁资源
输出

5、通过session存储验证信息

captcha.php
<?php
/**
* Created by PhpStorm.
* User: zhengjiayuan
* Date: 2018/7/15
* Time: 22:19
*/
session_start(); // 使用session
$image = imagecreatetruecolor(100,30);
// 为一副图像分配颜色
$bgcolor = imagecolorallocate($image,255,255,255);
// 为区域填充颜色
imagefill($image,0,0,$bgcolor);
$captch_code = ''; // 保存验证码信息
// 加入4个字母数字混合
for($i=0;$i<4;$i++){
$fontsize=6; // 数字大小
$fontcolor = imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120)); // 数字颜色
$data= 'abcdefhjkmnopqrstuvwxy345678';
$fontcontent = substr($data,rand(0,strlen($data)),1);
$captch_code .= $fontcontent;
$x = ($i*100/4) + rand(5,10); // 第i个字符的x坐标
$y = rand(5,10); // 第i个字符的y坐标
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),rand(80,220)); // 干扰线颜色
imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
}
$_SESSION['authcode'] = $captch_code; // 保存验证码信息到session 必须放在显示图片前 不然这句代码不执行
header('Content-type: image/png'); // 提前输出图片header信息
imagepng($image); // 浏览器输出图片
imagedestroy($image); // 销毁资源
form.php
<?php
/**
* Created by PhpStorm.
* User: zhengjiayuan
* Date: 2018/7/15
* Time: 23:11
*/
if (isset($_REQUEST['authcode'])){
session_start();
if (strtolower($_REQUEST['authcode']) == $_SESSION['authcode']){
echo '<font color="#0000CC">输入正确</font>';
}else{
echo '<font color="#0000CC">输入错误</font>';
}
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>确认验证码</title>
</head>
<body>
<form method="post" action="./form.php">
<p>验证码图片:<img src="./captcha.php?r=<?php echo rand()?>" border="1" width="100"></p>
<p>请输入图片中的内容: <input type="text" name="authcode" value="" /></p>
<p><input type="submit" value="提交" style="padding: 6px 20px;"/></p>
</form>
</body>
</html>


6、用JS实现动态校验验证码

<?php
/**
* Created by PhpStorm.
* User: zhengjiayuan
* Date: 2018/7/15
* Time: 23:11
*/
if (isset($_REQUEST['authcode'])){
session_start();
if (strtolower($_REQUEST['authcode']) == $_SESSION['authcode']){
echo '<font color="#0000CC">输入正确</font>';
}else{
echo '<font color="#0000CC">输入错误</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" src="./captcha.php?r=<?php echo rand()?>" border="1" width="100">
<!-- 实现动态校验验证码 -->
<a href="javasript: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>
网友评论