验证码的作用,为什么要存在验证码?

验证码的作用,为什么要存在验证码?

背景

在现代网络应用中,验证码被广泛使用以实现人机识别和减轻服务器负担。常见的验证码为以下几类:

图形验证码:通过展示一个随机生成的图形,要求用户输入对应的文字或数字来判断用户是否为真实用户。滑块验证码:用户需要在一个包含滑块的图形上,通过滑动滑块到指定位置或者旋转某个图形直到合适的位置来完成验证。短信验证码:用户在注册或登录过程中输入手机号码,并请求发送验证码到手机,然后用户通过查看手机短信来获取验证码。语音验证码:通过语音形式发送验证码到用户的手机或其他设备上,用户听取语音中的验证码后进行输入。主要用在视觉障碍用户或者在不方便查看图形验证码的用户。多种验证码相结合: 有些场景下,会将多种验证码相结合。如先通过图形验证码的测试,再进行短信验证码。其中短信验证码或者语音验证码一般都是直接购买第三方的服务来实现。

最后,采取哪种方式的验证码都是基于安全+体验+成功的综合考虑,合适的就是最好的。

图形验证码示例

随机文字

点击图形文字

数学运算

滑块验证码示例

普通滑块

旋转图形

短信验证码示例

语音验证码示例

你输入号码后,就会有一个PLJJ给你打电话了。。。。

图形验证码实现流程

我们先来讲讲相对简单的普通图形验证码

我们以登录为背景

泳道图

前端:用户打开登录页面,前端请求获取验证码后端:接收请求,生成验证码(图片和具体文本),为了区分是当前用户的请求,一般会同时生成唯一id

将验证码文本和唯一id存到服务端,如 redis,顺带存下时间,用来做验证码过期判断使用的将验证码图片和唯一id响应给前端前端:接收验证码图片和唯一 id,展示验证码图片前端:将用户名、密码、用户输入的验证码和唯一 id 一并提交给后端后端:接收数据,开始校验,并且返回校验结果相关代码

前端登录页面

vue

后端代码

使用的是 uniapp云开发中的云对象, 示例代码 没有引入 redis ,直接存在数据库中。 生成验证码插件用的是 svg-captcha

js

'use strict';

const svgCaptcha = require('svg-captcha'); // 生成验证码的插件

const db = uniCloud.database()

module.exports = {

_before: function() { // 通用预处理器

},

// 生成验证码

async getCaptcha() {

const captcha = svgCaptcha.create();

// 成功插入数据库后,res会获得当前数据的id,将这个id 看成唯一id即可。 也可以使用第三方库 nanoid 独立生成

const res = await db.collection("captcha").add({

text: captcha.text,

create_date: Date.now(),

})

// console.log(res)

//返回数据给客户端

return {

svg: captcha.data,

uuid: res.id

}

},

// 校验验证码

async valifyCaptcha(text, uuid) {

const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用,此处需要传入云对象的clientInfo

clientInfo: this.getClientInfo()

})

// 校验 唯一id和验证码和是否过期

const res = await dbJQL.collection("captcha").where(

`text=='${text}' && ${Date.now()} - create_date > ${1000*60} && _id=='${uuid}'`).count()

// console.dir(res)

return !!res.total

}

}

🔍 相关推荐