随着互联网技术的发展,图形验证码(captcha)被广泛应用在网站的登录、注册、找回密码等需要验证用户身份的地方。它通过图形方式展示一些问答、数字、字母等让用户来判断,达到防止机器人注册、暴力破解密码的目的。本篇文章将介绍如何用 node.js 实现图片验证码。
- 安装依赖
Node.js 中有许多第三方模块可以用来生成图形验证码,本文将使用 svg-captcha 模块,它可以生成 SVG 格式的验证码图片。在终端中执行以下命令安装它:
npm install svg-captcha
- 创建基本的项目结构
在工作目录下创建一个 app.js 文件和 public 文件夹,public 文件夹用来存放验证码图片。以下是目录结构:
- app.js
- public
- captcha.svg在 app.js 文件中,引入 svg-captcha 模块并创建一个 Express 实例:
const express = require('express')
const svgCaptcha = require('svg-captcha')
const app = express()
// 其他代码- 创建路由
为了实现图片验证码,需要创建一个路由来生成验证码图片。在 app.js 文件中创建一个路由 /captcha:
app.get('/captcha', (req, res) => {
const captcha = svgCaptcha.create()
res.type('svg')
res.status(200)
res.send(captcha.data)
})在这个路由中,调用 svgCaptcha.create() 函数可以生成一个随机的验证码字符串和对应的 SVG 图片,然后将其发送给客户端。
- 添加逻辑
为了使生成的验证码与客户端返回的验证码相匹配,需要将生成的验证码字符串保存在会话中,并在客户端提交表单时进行验证。在路由中添加以下逻辑:
app.get('/captcha', (req, res) => {
const captcha = svgCaptcha.create()
req.session.captcha = captcha.text
res.type('svg')
res.status(200)
res.send(captcha.data)
})
app.post('/login', (req, res) => {
const { username, password, captcha } = req.body
const expectedCaptcha = req.session.captcha
if (expectedCaptcha === captcha) {
// 验证码正确,进行登录操作
} else {
// 验证码错误,返回错误提示
}
})在 /captcha 路由中将生成的验证码字符串保存在会话中,然后在用户提交表单时将该验证码字符串与用户输入的验证码进行比对,如果相同则判断验证成功,进行后续操作。
- 启动服务器
完成以上步骤后,执行以下命令来启动服务器:
node app.js
然后在浏览器中访问 http://localhost:3000/captcha,应该可以看到生成的验证码图片。在登录表单中输入验证码并提交表单,可以进行后续操作。
总结
使用 Node.js 实现图片验证码并不难,只需要一个第三方模块即可完成。但是,为了提高验证码的安全性,需要注意以下几点:
- 生成的验证码字符串应该足够复杂,尽量包含大小写字母、数字和特殊字符。
- 应该限制验证码的有效期,一般 5 分钟左右即可,以防止验证码被攻击者保存后在有效期内不断尝试。
- 验证码应该随机生成,避免预测和复制。
- 应该使用会话来保存验证码字符串,不要将验证码直接存储在客户端或服务端缓存中。









