Node.js驗證碼:從生成到驗證的趣味之旅

文章目錄

  • 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…