1.1 定义
网页验证码(CAPTCHA,全称Completely Automated Public Turing test to tell Computers and Humans Apart)是一种应用程序,主要用于保护 web 页面免受自动化恶意程序(如网络蠕虫或垃圾邮件)的攻击。
1.2 作用
网页验证码的作用在于防止自动化攻击。它将人与机器区分开来,确保只有人可以访问或提交表单。验证码还能阻止人类在敏感网站内的非法活动,如发布垃圾信息或攻击网站。
1.3 类型
目前常见的网页验证码有以下几种:
字符型(包括普通字符、随机字符、数字)
图像型(包括栅格图像和连通图像)
语音型
交互型
移动型
时间型
生物信息型
1.4 实现
实现网页验证码需要先将验证码生成器托管在服务器上。当用户访问网站时,服务器将生成一个验证码并将其发送回客户端。客户端将验证码呈现给用户,用户需在验证框内键入验证码,并将其提交到服务器进行验证。
服务器收到数据后将其与之前的验证码比较,确定用户是否为人类,若用户通过验证,则允许其继续进行操作,否则视为无效操作,禁止其访问。
二、验证码的代码实现
2.1 字符型验证码
(1)普通字符
普通字符验证码的实现较为简单,代码如下:
``` html
```
``` php
<?php
/*生成几个随机字符*/
$str = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";
$code = \"\";
for ($i = 0; $i< 4; $i++) {
$code .= substr($str, rand(0, strlen($str) - 1), 1);
}
/*将生成的验证码存储到 session 变量中*/
session_start();
$_SESSION[code] = $code;
/*生成图片*/
$img = imagecreate(100, 40);
$bg_color = imagecolorallocate($img, 255, 255, 255);
$code_color = imagecolorallocate($img, 0, 0, 0);
imagestring($img, 5, 10, 15, $code, $code_color);
header(\"Content-type:image/png\");
imagepng($img);
imagedestroy($img);
?>
```
上述代码的实现逻辑为:
1)将随机生成的 4 个字符存储到 session 变量中。
2)生成一个 100*40 的图片,将背景色设置为白色,将验证码字符颜色设置为黑色。
3)将随机字符写入图片。
4)访问 image.php,将页面中的 img 标签指向生成的验证码图片,向服务器提交表单,将用户输入的验证码与存在 session 变量中的验证码作比较,若相同则表明用户为人类,否则为机器。
(2)随机字符
随机字符验证码的实现也较为简单,与普通字符验证码的实现差别不大,只需将生成随机字符的代码换为以下代码即可:
``` php
/*生成随机字符*/
$word_length = 4;
$words = 123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz;
for($i = 0; $i< $word_length; $i++){
$code .= $words{mt_rand(0, strlen($words) - 1)};
}
```
2.2 图像型验证码
(1)栅格图像
栅格图像验证码是指在图像上加入噪点,增加用户输入的难度,代码实现如下:
``` php
/*设置字体路径*/
$font = \"C:/Windows/Fonts/msyh.ttf\";
$fontSize = 25;
$image = imagecreate(100, 30);
/* 随机生成验证码 */
$code = \"\";
for ($i = 0; $i< 4; $i++) {
$code .= chr(rand(97, 122));
}
session_start();
$_SESSION[code] = $code;
/* 给画布填充背景色 */
$bgColor = imagecolorallocate($image, 250, 250, 250);
imagefill($image, 0, 0, $bgColor);
/* 画验证码 */
for ($i = 0; $i< strlen($code); $i++) {
$x = 15 + ($i * 20);
$y = rand(18, 23);
$color = imagecolorallocate($image, rand(0, 150), rand(0, 150), rand(0, 150));
imagettftext($image, $fontSize, rand(-30, 30), $x, $y, $color, $font, $code{$i});
}
/* 随机生成干扰点 */
for ($i = 0; $i< 200; $i++) {
$x = rand(0, 100);
$y = rand(0, 30);
$color = imagecolorallocate($image, rand(150, 255), rand(150, 255), rand(150, 255));
imagesetpixel($image, $x, $y, $color);
}
header(\"Content-type:image/png\");
imagepng($image);
imagedestroy($image);
```
上述代码实现逻辑为:
1)随机生成四个字符。
2)将字符写入图片。
3)随机生成 200 个干扰点,提高图像的识别难度。
4)将验证码存储到 session 变量中。
(2)连通图像
连通图像验证码的实现方法与栅格图像验证码类似,不同之处在于连通图像验证码将噪点改成了曲线,故需引用 PHP 的 GD 库。
``` php
$checkcode = \;
for ($i = 0; $i< 4; $i++) {
$checkcode .= strtoupper(sprintf(\"%s\", dechex(rand(0, 15))));
}
session_start();
$_SESSION[validate_code] = $checkcode;
$img = imagecreatetruecolor(70, 45);
$white = imagecolorallocate($img, 255, 255, 255);
imagefill($img, 0, 0, $white);
$ttf = array(\"DroidSansFallback.ttf\");
$fontsize = 20;
for ($i = 0; $i< strlen($checkcode); $i++) {
$fontcolor = imagecolorallocate($img, rand(0, 200), rand(0, 200), rand(0, 200));
$angle = rand(-15, 15);
$x = $i * 15 + 10;
$y = rand(25, 40);
imagettftext($img, $fontsize, $angle, $x, $y, $fontcolor, $ttf[array_rand($ttf)], $checkcode[$i]);
}
//add line
for ($i = 0; $i< 3; $i++) {
$dx = rand(20, 50);
$sx = rand(20, 50);
$dy = rand(0, 45);
$sy = rand(0, 45);
imageline($img, $dx, $dy, $sx, $sy, $fontcolor);
}
header(\"content-type:image/png\");
imagepng($img);
imagedestroy($img);
```
上述代码实现逻辑与栅格图像类似,不同之处在于:
1)使用了不一样的字体。
2)增加了噪点曲线。
3)误差路径的生成方式不同。
2.3 语音型验证码
语音型验证码实现较为复杂,常用的实现方式是使用 python 的第三方库 pyaudio、wavesurfer 和 wave,配合 PHP 使用。实现方式较为繁琐,此处不再赘述。
2.4 交互型验证码
交互型验证码是指需要用户点击指定区域才能通过验证的验证码。实现方式主要依赖 ajax 和 PHP,代码如下:
``` html
请点击下图中的
小人
<script type=\"text/javascript\" src=\"./jquery.min.js\"></script>
<script type=\"text/javascript\">
$(function(){
$(#ya_bg_pic).on(click,function(){
$(#ya_bg_pic).css(ackground-image, url(./ya_pic_ture.jpg));
$(#ya_text).text(验证通过);
$(#ya_text2).remove();
$(#ya_box).css(ackground-color,#69a646);
$(#ya_bg).off();
$.post(./check.php, function(data){
if(data== rue){
$(#login_b).removeAttr(disabled);
}else{
alert(您未通过安全检测!);
};
});
});
});
</script>
```
check.php 文件:
``` php
<?php
if(isset($_POST[ya])){
if($_POST[ya] == ure){
echo ure;
}else{
echo false;
}
}
?>
```
上述代码实现逻辑为:
1)页面初始化时,随机生成两张拼图,其中一张毛色小人。
2)当用户点击毛色小人时,触发 ajax 请求,将验证结果提交到 check.php 文件进行处理。
3)若验证结果为真,则可以访问网站;否则,弹出提示框并禁止访问。
2.5 移动型验证码
移动型验证码实现起来也比较复杂,需要使用 javascript 的事件监听函数和 CSS3 动画效果。此处以图片拼图为例,代码如下:
``` html
style=\"
width: 320px;
height: 320px;
background-size: cover;
background-image:url(dragon.jpg);
background-position: center center;
border-radius: 10px;
position: relative;
margin: 5px auto;
z-index: 1;
background-repeat:no-repeat;
\"
>
id=\"cell\"
style=\"
width: 100px;
height: 80px;
border-radius: 5px;
position: absolute;
cursor: pointer;
background-size: cover;
background-repeat: no-repeat;
box-shadow: 0 0 10px 5px rgba(0, 0, 0, .1);
opacity: 0.7;
top: 0;
left: 0;
\"
>
<script>
let ele = document.getElementById(cell);
let isDown = false;
let oX, oY;
ele.addEventListener(mousedown, function(evn){
let e = evn || event;
isDown = true;
oX = e.clientX - ele.offsetLeft;
oY = e.clientY - ele.offsetTop;
});
ele.addEventListener(mousemove,function(evn){
let e = evn || event;
if(!isDown) return;
let x = e.clientX;
let y = e.clientY;
x = x - oX;
y = y - oY;
if(x<= 0) x = 0;
if(y<= 0) y = 0;
if(x >= 230) x = 230;
if(y >= 230) y = 230;
ele.style.left = x + px;
ele.style.top = y + px;
});
ele.addEventListener(mouseup, function(evn){
let e = evn || event;
isDown = false;
if(ele.offsetLeft<217||ele.offsetLeft>225||ele.offsetTop<338||ele.offsetTop>346){
alert(\"error!\");
ele.style.top = 0 + px;
ele.style.left = 0 + px;
}else{
alert(\"pass!\");
}
});
</script>
```
上述代码实现逻辑为:
1)首先将一张龙的图片设置为背景,并在其中随机取出一个小正方形。
2)实现双指式拖动效果,即记住鼠标按下的位置,鼠标移动时直接修改被拖动元素的位置,直到释放鼠标。
3)当小正方形移动到图片的正确位置后,弹出验证成功的提示。
4)若小正方形越过边界,则弹出验证失败的提示,并将小正方形移回初始位置。
2.6 时间型验证码
时间型验证码的实现方式与普通字符验证码十分相似,其区别主要在于验证码的生成方式不同。以 2 小时为例,代码实现如下:
``` php
session_start();
/*获取当前时间戳*/
$current_time = time();
/*将当前时间戳除以 7200,保留整数部分*/
$code = intval($current_time / 7200);
$_SESSION[code] = $code;
fmt_time($code);
function fmt_time($timestamp) {
$valid_time = 7200;
$left_time = $valid_time - $timestamp % $valid_time;
$left_mins = intval($left_time / 60);
$left_secs = $left_time % 60;
printf(\%02d:%02d, $left_mins, $left_secs);
}
```
上述代码实现逻辑为:
1)获取当前时间戳。
2)将当前时间戳除以 7200,保留整数部分,生成验证字符串。
3)将验证字符串存储到 session 变量中。
4)将字符串格式化输出,以当前剩余的时间为参数。
三、总结
网页验证码在保护 web 页面免受自动化恶意程序攻击方面起到了重要作用。常见的网页验证码类型包括字符型、图像型、语音型、交互型、移动型和时间型。每一种验证码 依据其实现方式不同,代码实现的难度也不同,但无论采用何种方式,均要确保生成的验证码有效,只有这样才能更好地保护网站的安全。
1. 网页设计的验证码是什么?
网页设计的验证码是一种保护用户隐私和安全的技术,通常用于识别用户是否为真实人类而不是机器人或自动化程序。在网站登录、注册、评论、订阅等过程中,都可能需要用户先输入验证码才能继续操作。验证码通常由一组数字、字母、符号等随机组合构成,用户需要根据图像、声音、计算等方式正确输入验证码才能通过验证。
2. 网页设计验证码的作用是什么?
网页设计的验证码主要有以下几个作用:
(1)防止恶意攻击:许多网络攻击或欺诈行为都是通过机器人或自动化程序实现的,例如爆破密码、注册大量虚假账户、恶意留言等。验证码可以有效阻止这些攻击行为,并保障网站数据的安全性。
(2)保护用户隐私:通过验证码,网站可以确认用户是否为真实人类,防止被恶意程序侵犯用户隐私或泄露个人信息。
(3)增强用户体验:验证码可以提高注册、登录等账户操作的安全性和可靠性,避免用户在无法识别虚假账户或恶意评论时产生不安或不愉快的体验。
3. 网页设计验证码的种类有哪些?
网页设计验证码主要分为以下几种:
(1)图像验证码:最常见的验证码形式,通过随机生成数字、字母、符号等组合,转换成图片形式,让用户进行识别输入。
(2)音频验证码:通过播放数字、字母、语音等声音形式,让用户进行识别输入。
(3)算术验证码:通过随机生成简单的算术运算题(如加减乘除),让用户进行计算并输入结果。
(4)滑动验证码:将验证过程转化成滑动、拼图等操作,增加趣味性和用户体验,同时防止机器人的攻击。
(5)行为验证码:通过分析用户的鼠标、滚轮等行为特征,以及短信、邮件等方式进行验证,以确定用户是否为真实人类。
4. 网页设计验证码的技术实现是怎样的?
网页设计验证码的实现技术通常基于以下几个方面:
(1)随机数/字符生成:验证码的核心是随机生成数字、字母、符号等组合,通常需要借助编程语言或网页设计工具来实现。常用的编程语言有PHP、Python、Java等,常用的网页设计工具有Photoshop、Illustrator等。
(2)字体样式/图片设计:随机生成的验证码需要以字体样式或图片形式呈现给用户,因此需要设计相应的字体样式或图片。字体样式通常通过CSS来设置,图片设计则需要借助Photoshop、Illustrator等工具。
(3)前端验证:前端验证主要是指前端代码的验证,通过JavaScript等语言来实现用户输入的验证。这种验证方式的优点在于可以提高用户反馈和用户体验,缺点在于消息总线可能被某些程序过滤掉。
(4)后端验证:后端验证主要是指服务器端的验证,通过PHP、Python等语言实现,进行验证码的验证、保存、登录权限控制等操作。相比于前端验证,后端验证更为安全可靠,可以有效防止绕过验证的攻击。
5. 网页设计验证码存在哪些问题?
网页设计验证码在解决部分安全问题的同时,也存在以下几个问题:
(1)验证过程繁琐:用户需要输入、复制、听取等多种形式的验证方式,使得验证过程繁琐、耗时,影响用户体验。
(2)容易被攻击:部分验证码设计存在漏洞,容易被机器人程序攻击者绕过,影响验证的安全性和效果。
(3)有损用户隐私:部分验证码要求用户输入个人电话号码、邮箱等敏感信息,容易对用户隐私造成侵犯,引发用户担忧。
(4)带来访问问题:使用验证码会引起用户的失去信心,从而减少网站的访问量,降低网站的流量。
6. 网页设计验证码的应用场景是哪些?
网页设计验证码在以下几个方面具有广泛的应用场景:
(1)注册/登录:在用户注册、登录网站时,常常需要输入验证码,以保护用户隐私和网站安全。
(2)评论/留言:在网页评论、留言板等功能中,需要保证用户的身份和真实性,避免恶意的虚假信息或骚扰信息。
(3)订阅/下载:在订阅、下载文件等功能中,为了保护版权和避免不必要的垃圾订单和下载,也需要使用验证码。
(4)支付/购物:在购物网站上进行购物、支付时,使用验证码可以防止消费欺诈和机器人恶意盗刷等行为。
7. 网页设计验证码的发展趋势是什么?
当前,随着人工智能、深度学习等技术的快速发展,验证码的识别和攻击技术也越来越高端,验证码的设计也在不断进化。未来的验证码设计可能会更加智能化、人性化和可感知性。例如,基于人脸识别技术、声纹识别技术等,可以实现更加便捷的验证方式,并且可以消除用户不理解、不舒适的验证过程;基于智能图形变形技术、深度学习技术等,可以更好地防止机器人攻击和攻击者识别验证码的问题。
综上所述,作为保护用户隐私和安全的技术手段,网页设计的验证码在网站注册、登录、评论等功能中起着重要的作用。尽管存在一定的问题和缺陷,但是随着技术的发展,验证码的设计将不断创新和完善,以提高用户体验和安全性。