文章目录

  • Node.js验证码:从生成到验证的趣味之旅
    • 📜 引言:为什么需要验证码?
    • 1. 验证码的基本原理 🧠
      • 验证码工作流程示意图
    • 2. 技术栈准备 🛠️
    • 3. 验证码生成详解 🎨
      • 3.1 生成SVG验证码
      • 3.2 转换为PNG格式
      • 3.3 存储验证码信息
    • 4. 验证码验证流程 🔍
      • 4.1 验证步骤分解
      • 4.2 关键验证代码
      • 4.3 验证码的一次性使用
    • 5. 检查成果
      • 生成的地址如:
      • 写到img中看效果:
      • 效果展示:
    • 6. 安全增强措施 🛡️
    • 7. 常见问题与解决方案 ❓
      • Q1: 为什么验证码图片要转为PNG?
      • Q2: 如何防止验证码被OCR识别?
      • Q3: 为什么验证码要设置过期时间?
    • 8. 扩展思路 💡
    • 结语 🌟
    • 9. 扩展思路 💡
    • 结语 🌟

Node.js验证码:从生成到验证的趣味之旅

📜 引言:为什么需要验证码?

想象一下,你开了一家网红奶茶店,每天有无数人排队购买。突然有人用机器人疯狂下单,导致真正想喝奶茶的顾客买不到。验证码就像奶茶店的"人工排队检测器",确保每个请求都来自真实用户。

在Web开发中,验证码(CAPTCHA)主要用于:

  • 防止机器人暴力破解(如登录爆破)
  • 保护敏感接口(如查询个人信息)
  • 减轻服务器压力(过滤无效请求)

验证码是现代Web应用中常见的安全机制,它能有效防止机器人恶意攻击。今天,我们就来深入探索Node.js中验证码的生成与验证过程,就像一场有趣的冒险旅程!

1. 验证码的基本原理 🧠

验证码(CAPTCHA)全称是"Completely Automated Public Turing test to tell Computers and Humans Apart"(全自动区分计算机和人类的图灵测试)。它的核心思想是:

“创建一个人类容易识别但计算机难以识别的测试”

验证码工作流程示意图

客户端请求验证码
服务器生成SVG验证码
转换为PNG图片
返回Base64编码图片
用户提交表单+验证码
服务器校验验证码
验证通过?
执行业务逻辑
返回错误提示

2. 技术栈准备 🛠️

在我们这个例子中,使用了以下关键技术:

技术作用特点
expressWeb框架轻量灵活,处理HTTP请求
svg-captcha生成SVG验证码纯JS实现,无需编译
sharp图像处理高性能的图片转换库
express-session会话管理存储验证码文本

3. 验证码生成详解 🎨

让我们拆解代码中的验证码生成部分:

3.1 生成SVG验证码

const svgCaptcha = require('svg-captcha');
const sharp = require('sharp');
const session = require('express-session');// 配置session中间件
router.use(session({secret: 'stu_xpx_200701',resave: false,saveUninitialized: true,cookie: { secure: false } // 生产环境应该设置为true(HTTPS)
}));// 生成验证码路由
router.get('/captcha', async (req, res) => {// 创建包含4个字符的彩色验证码(排除易混淆字符)const captcha = svgCaptcha.create({size: 4,          // 4个字符ignoreChars: '0o1i', // 排除易混淆字符noise: 2,         // 干扰线数量color: true       // 彩色显示});// 存储验证码(带1分钟过期时间)req.session.captcha = {text: captcha.text.toLowerCase(), // 转为小写存储expiresAt: Date.now() + 60000     // 当前时间+1分钟};

💡 关键点:

参数说明
size4验证码包含4个字符
ignoreChars‘0o1i’排除数字0、字母o、数字1、字母i等易混淆字符
noise2添加2条干扰线增加识别难度
colortrue使用彩色而非黑白

3.2 转换为PNG格式

为什么我们要将SVG转为PNG?

45% 30% 25% 图片格式选择原因 兼容性 安全性 性能

使用sharp库转换:

    try {// 将SVG转为PNG(兼容更多浏览器)const pngBuffer = await sharp(Buffer.from(captcha.data)).png().toBuffer();// 返回Base64编码的图片res.type('png').json({code: 0,data: `data:image/png;base64,${pngBuffer.toString('base64')}`,msg: "验证码图片获取成功"});} catch (err) {console.error('生成PNG失败:', err);res.status(500).json({ code: -1, msg: "生成验证码失败" });}

🔧 技术细节:

  1. Buffer.from() 将SVG字符串转为二进制数据
  2. sharp() 进行图片格式转换
  3. toString('base64') 生成前端可直接显示的DataURL

3.3 存储验证码信息

我们不仅存储验证码文本,还存储过期时间:

req.session.captcha = {text: captcha.text.toLowerCase(), // 验证码文本expiresAt: Date.now() + 1 * 60 * 1000 // 1分钟后过期
};

这种设计比单纯存储文本更安全,因为它:

  1. 强制验证码有时效性
  2. 防止重放攻击
  3. 自动清理过期验证码

4. 验证码验证流程 🔍

当用户提交表单时,我们需要验证验证码:

4.1 验证步骤分解

用户 服务器 提交表单(姓名,身份证,验证码) 检查必填字段 检查验证码是否存在 检查验证码是否过期 比较验证码文本 返回验证结果 用户 服务器

4.2 关键验证代码

router.post("/query", async (req, res) => {// 检查必填参数if (!req.body.studentname || !req.body.id_card || !req.body.code) {return res.status(400).json({ code: -1, msg: "缺少必要参数" });}// 验证码三重校验if (!req.session.captcha) {return res.status(400).json({ code: -1, msg: "验证码已过期" });}if (req.session.captcha.expiresAt < Date.now()) {return res.status(400).json({ code: -1, msg: "验证码已过期" });}if (req.session.captcha.text !== req.body.code.toLowerCase()) {return res.status(400).json({ code: -1, msg: "验证码错误" });}// 验证通过后立即销毁验证码(一次性使用)delete req.session.captcha;// 验证码通过后的代码逻辑...

🛡️ 安全策略:

  • 时间过期机制:1分钟后自动失效
  • 大小写无关校验:统一转为小写比较
  • 一次性使用:验证后立即删除session存储

4.3 验证码的一次性使用

验证通过后立即删除验证码,防止重复使用:

// 验证通过后删除验证码(一次性使用)
delete req.session.captcha;

5. 检查成果

按照以上操作就可以生成一个png地址了,那我们可以检查这个是否有效,执行以下步骤:

生成的地址如:

返回地址:data:image/png;base64,${pngBuffer.toString('base64')}

如:
data:image/png;base64,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

写到img中看效果:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><img src="data:image/png;base64,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" alt="">
</body>
</html>

效果展示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6. 安全增强措施 🛡️

我们的实现已经包含了一些安全最佳实践:

安全措施实现方式防护目标
时效性设置1分钟过期防止暴力破解
大小写不敏感统一转小写比较提升用户体验
排除混淆字符ignoreChars参数减少用户识别困难
一次性使用验证后立即删除防止重放攻击
干扰线noise参数增加机器识别难度

7. 常见问题与解决方案 ❓

Q1: 为什么验证码图片要转为PNG?

A1: SVG虽然是矢量格式,但:

  • 某些老旧浏览器支持不好
  • 直接显示SVG可能暴露验证码结构
  • PNG更通用,且可以添加额外处理

Q2: 如何防止验证码被OCR识别?

A2: 可以:

  1. 增加更多干扰元素(噪点、干扰线)
  2. 使用扭曲变形文字
  3. 添加背景图案
  4. 使用动态验证码(如gif)

Q3: 为什么验证码要设置过期时间?

A3: 因为:

  • 防止长期有效的验证码被利用
  • 减少服务器存储压力
  • 符合安全最佳实践

8. 扩展思路 💡

如果想进一步提升验证码系统,可以考虑:

  1. 行为验证码:如滑动拼图、点击特定区域
  2. 短信/邮件验证码:多因素认证
  3. 频率限制:同一IP/用户限制尝试次数
  4. 机器学习:检测异常请求模式

结语 🌟

验证码虽小,却承载着重要的安全使命。通过本文的讲解,相信你已经掌握了Node.js中验证码生成与验证的核心要点。记住,好的验证码应该在安全性和用户体验之间找到平衡点——既不能让机器人轻易破解,也不能让真实用户感到困扰。

服务器存储压力

  • 符合安全最佳实践

9. 扩展思路 💡

如果想进一步提升验证码系统,可以考虑:

  1. 行为验证码:如滑动拼图、点击特定区域
  2. 短信/邮件验证码:多因素认证
  3. 频率限制:同一IP/用户限制尝试次数
  4. 机器学习:检测异常请求模式

结语 🌟

验证码虽小,却承载着重要的安全使命。通过本文的讲解,相信你已经掌握了Node.js中验证码生成与验证的核心要点。记住,好的验证码应该在安全性和用户体验之间找到平衡点——既不能让机器人轻易破解,也不能让真实用户感到困扰。

现在,就动手实现你自己的验证码系统吧!当你看到那些五彩斑斓的扭曲字符时,不妨会心一笑——这可是你和机器人之间的智慧较量呢!🤖 vs 🧑💻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/84937.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/84937.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/84937.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

芯科科技携最新Matter演示和参考应用精彩亮相Matter开放日和开发者大会

全面展示赋能Matter设备实现跨协议和跨海内外生态的技术能力 作为Matter标准创始厂商之一和其解决方案的领先供应商&#xff0c;Silicon Labs&#xff08;亦称“芯科科技”&#xff09;于6月12至13日参加由连接标准联盟中国成员组&#xff08;CMGC&#xff09;主办的Matter年度…

AndroidStudio下载的SDK没有tool目录,或者想要使用uiautomatorviewer工具

1.如果没有tool目录可以使用下面的地址进行下载 https://dl.google.com/android/repository/tools_r25.2.5-windows.zip 2.并且把下载的文件解压到放在AndroidStudio的目录中 3.如果使用uiautomatorviewer.bat出现下面的错误 Unable to connect to adb.Check if adb is instal…

FastJSON等工具序列化特殊字符时会加转义字符\

在Java中JSON数据格式用String接收时&#xff0c;此时在FastJSON层面看来该JSON只是普通字符串&#xff0c;所以对原字符串序列化会得到转义字符\ 得到转义后字符串&#xff0c;再反序列化转义后字符串会得到原字符串 String json"{\"name\": \"张三\&quo…

数据结构 学习 队列 2025年6月14日 11点22分

循环队列 循环队列是一种线性数据结构&#xff0c;它遵循FIFO&#xff08;先进先出&#xff09;原则&#xff0c;但与普通队列不同的是&#xff0c;循环队列的最后一个元素连接回第一个元素&#xff0c;形成一个环形结构。这种设计有效解决了普通队列的"假溢出"问题&…

打造丝滑滚动体验:Scroll-driven Animations 正式上线!

&#x1f300; 打造丝滑滚动体验&#xff1a;Scroll-driven Animations 正式上线&#xff01; &#x1f6a8; 告别 JS 手动监听滚动条&#xff0c;CSS 新能力让你用两行代码实现高级滚动动效。 &#x1f50d; 什么是 Scroll-driven Animations&#xff1f; Scroll-driven anim…

知识体系_研究模型_价格敏感度测试模型(PSM)

1 概述 价格敏感度测试模型(Price Sensitivity Measurement,PSM) ,通过调研潜在用户对于不同价格的满意或接受程度,从而制定出合适的产品价格。 价格敏感度PSM模型的分析一般分为以下几个步骤: (1)确定多个价格 (2)通过一定的方式(通常是问卷)收集目标客户对不同价…

C++11函数封装器 std::function

✅ 1. 什么是 std::function std::function 是 C11 引入的标准库工具&#xff0c;是一个通用的函数封装器&#xff0c;可以包装以下任意可调用对象&#xff1a; 普通函数Lambda 表达式函数指针成员函数指针函数对象&#xff08;也叫仿函数&#xff0c;定义了 operator() 的类…

centos系统docker配置`milvus-standalone`教程

本人使用的是京东云服务器docker配置milvus 参考教程&#xff1a;https://blog.csdn.net/withme977/article/details/137270087 需要注意&#xff1a;虚拟机安装pymilvus和docker安装milvus版本需要对应&#xff0c;否则会出现connection失败问题 查看虚拟机pymilvus版本&…

AI for 数据分析:技术演进与应用实践

一、AI 数据分析的核心定义与技术演进 概念延伸&#xff1a;从传统分析到智能分析 传统数据分析工作&#xff0c;主要依赖人工使用 Excel、SPSS 等统计工具进行建模与分析。这种方式不仅效率较低&#xff0c;而且对专业人员的依赖度极高。而 AI 驱动的数据分析则借助机器学习…

stm32 f103c8t6仿真 串口收发测试

C8T6串口概述 STM32F103C8T6微控制器包含3个串口模块&#xff1a; USART1 (高级串口) USART2 USART3 (部分型号可能标记为UART3) 引脚分布图 USART1 (串口1) 基本特性 类型&#xff1a;全功能USART(通用同步异步收发器) 通信模式&#xff1a; 全双工异步通信 单线半…

语言特性适用的场景:卫星、火箭控制系统用什么开发语言?

核心飞行控制系统开发语言 卫星、火箭及相关航天系统的软件开发对可靠性、实时性、安全性有极高要求&#xff0c;因此语言选择需严格匹配这些需求。以下是航天领域常用的编程语言及其应用场景分析&#xff1a; 一、核心飞行控制与嵌入式系统&#xff1a;C、C、Ada 航天器的核…

AI for Science:智能科技如何重塑科学研究

AI与科学研究的邂逅 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;作为一门致力于模拟人类智能的交叉学科&#xff0c;近年来已经从实验室走向现实世界的各个角落&#xff0c;而科学研究领域正是其最具变革潜力的舞台之一。AI的核心在于通过算法…

项目三 - 任务7:开发名片管理系统

在本次项目三的任务7中&#xff0c;我们成功开发了一个功能全面的名片管理系统。该系统采用Java语言&#xff0c;基于MVC&#xff08;模型-视图-控制器&#xff09;架构模式&#xff0c;实现了用户登录、名片的增删改查等核心功能。通过设计Card类来封装名片信息&#xff0c;Ca…

MySQL 8.0 OCP 英文题库解析(十八)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题161~170 试题1…

leetcode_503 下一个更大元素

1. 题意 在一个循环数组中&#xff0c;找到下一个比它大的数。 2. 题解 也不知道怎么就单调栈了&#xff0c;可能是刷出来的吧。。。 还是来解释一下吧&#xff01;&#xff01;&#xff01; 如果有新元素入栈 c c c&#xff0c; 那么在栈内的元素只要小于新元素的 s s s…

在postgresql中,group by时取第一个值

在postgresql中,group by时,uuid类型的字段可以用哪个聚集函数: SELECT create_user , (array_agg(myid))[1] AS first_uuid FROM "t_resource_data" GROUP BY create_user 人大金仓、PostgreSQL使用GROUP BY聚合后&#xff0c;取第一个值或最后一个值的办_pgsql gro…

【FineDance】ModuleNotFoundError: No module named ‘pytorch3d‘

pytorch3d Traceback (most recent call last): File “/home/zhangbin/perfwork/01_ai/13_FineDance/data/code/pre_motion.py”, line 12, in from dataset.quaternion import ax_to_6v, ax_from_6v File “/home/zhangbin/perfwork/01_ai/13_FineDance/dataset/quaternion.…

MySQL 调优笔记

1.如何定位慢查询? 定位慢查询主要依靠 MySQL 的慢查询日志配合工具如 pt-query-digest &#xff0c;mysqldumpslow 进行分析&#xff0c;或者通过 performance_schema 进行实时监控&#xff0c;进一步可以使用 EXPLAIN 分析执行计划。 -> 开启慢查询日志 -- 查看慢查询…

嵌入式 STM32 开发问题:烧录 STM32CubeMX 创建的 Keil 程序没有反应

烧录 STM32CubeMX 创建的 Keil 程序没有反应问题原因 大概率是因为没有勾选 Reset and Run&#xff0c;程序成功烧录到&#xff0c;但芯片不会自动复位并执行&#xff0c;而是保持停止状态 处理策略 在 Keil 中勾选 Reset and Run 点击 【Options for Target】 点击 【Debu…