一、验证码生成原理
核心目的是确保是人在使用系统。图片验证码、拖动验证码、拼图验证码、问答验证码
计算验证码等
图片验证码的原理主要是基于以下三个方面:
1.随机生成的字符,确保无规律可言
2.使用图片来进行展示,而非其他手段
3.尽量让文字变形并形成扰乱图像
二、验证码代码实现
添加码源:vcode.php,基于PHP绘制基础图片,生成验证码,然后将验证码保存到session变量中
<?php
session_start();
// 当客户端已经获取session-ID时,只要通过HTTP请求中的cookie字段将其发给服务器,服务器不会再生成新的session ID.
session_start();
getCode();
// 生成验证图片验证码 vlen验证码的长度 width 高度 height 宽度
function getCode($vlen=4,$width=80,$height = 25){
// 定义响应类型为PNG图片
header("content-type:image/png");
// 生成随机验证码字符串,并将其保存于session中
$chars = 'abcdefjhijkmnopqrstuvwxyzABCDEFGHIJKMNOPQRSTUVWXYZ0123456789';
$vcode = substr(str_shuffle($chars),0,$vlen);
// str_shuffle($chars)将字符打乱
$_SESSION['vcode'] = $vcode;
// 定义图片并设置背景色RGB为:100,200,100
$image = imagecreate($width,$height);
$imgColor = imagecolorallocate($image,100,200,100);
// 以RGB=0,0,0的颜色绘制黑色文字
// 任何的定位都是在第四象限
$color = imagecolorallocate($image,0,0,0);
imagestring($image,5,20,5,$vcode,$color);
// 生成一批随机位置的干扰点
for($i=0;$i<50;$i++){
imagesetpixel($image,rand(0,$width),rand(0,$height),$color);
}
// 输出图片验证码,并将其再内存的数据销毁,要不然消耗内存
imagepng($image);
imagedestroy($image);
}
?>
三、在登录页面添加验证码login.html以图片的方式展示出来
<div class="login">
<input type="text" name="vcode"/>
<img src="./vcode.php">
</div>
四、登录验证码的校验
修改login.php
if(strtoupper($_SESSION['vcode']) != strtoupper($vcode)){
die("vcode-error");
}
验证码一旦生成后,不一定必须保存在session中,任何可以存储数据的方式均可以,比如数据库,文件,内存,或者保存在Redis
缓存服务器中。比如短信验证码,通常会有一个时间限制(5分钟内有效),最好的解决方案就是使用redis缓存,并设置key的过期时间。