当前位置:首页 > JavaScript

js验证码的实现

2026-01-15 14:47:55JavaScript

验证码的基本实现原理

验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。

纯前端验证码实现示例

以下是一个简单的数字验证码生成与验证的前端实现:

// 生成随机验证码
function generateCaptcha() {
  const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  let captcha = '';
  for (let i = 0; i < 6; i++) {
    captcha += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  document.getElementById('captchaDisplay').textContent = captcha;
  return captcha;
}

let currentCaptcha = generateCaptcha();

// 验证用户输入
function validateCaptcha() {
  const userInput = document.getElementById('captchaInput').value;
  if (userInput === currentCaptcha) {
    alert('验证码正确');
    return true;
  } else {
    alert('验证码错误');
    generateCaptcha();
    return false;
  }
}

结合Canvas的图形验证码

更安全的实现方式是通过Canvas生成图形验证码:

js验证码的实现

function drawCaptcha() {
  const canvas = document.getElementById('captchaCanvas');
  const ctx = canvas.getContext('2d');
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  // 生成随机字符串
  const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
  let captchaText = '';
  for (let i = 0; i < 6; i++) {
    captchaText += chars.charAt(Math.floor(Math.random() * chars.length));
  }

  // 绘制背景和干扰元素
  ctx.fillStyle = '#f0f0f0';
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  // 绘制文本
  for (let i = 0; i < captchaText.length; i++) {
    ctx.font = '24px Arial';
    ctx.fillStyle = getRandomColor();
    ctx.fillText(
      captchaText[i],
      15 + i * 20,
      30 + Math.random() * 10
    );
  }

  // 绘制干扰线
  for (let i = 0; i < 5; i++) {
    ctx.strokeStyle = getRandomColor();
    ctx.beginPath();
    ctx.moveTo(Math.random() * canvas.width, Math.random() * canvas.height);
    ctx.lineTo(Math.random() * canvas.width, Math.random() * canvas.height);
    ctx.stroke();
  }

  return captchaText;
}

function getRandomColor() {
  const letters = '0123456789ABCDEF';
  let color = '#';
  for (let i = 0; i < 6; i++) {
    color += letters[Math.floor(Math.random() * 16)];
  }
  return color;
}

后端验证的必要性

前端验证码容易被绕过,应结合后端验证:

  1. 服务端生成验证码文本并存储(如Session)
  2. 将验证码图像发送到客户端
  3. 用户提交后,服务端比对存储的验证码

Node.js示例:

js验证码的实现

// Express服务端示例
const express = require('express');
const session = require('express-session');
const app = express();

app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: true }));

app.get('/captcha', (req, res) => {
  const captcha = generateRandomString();
  req.session.captcha = captcha;

  // 生成图像并发送
  const canvas = createCanvas(150, 50);
  // ...绘制验证码图像...
  res.set('Content-Type', 'image/png');
  canvas.pngStream().pipe(res);
});

app.post('/verify', (req, res) => {
  if (req.body.captcha === req.session.captcha) {
    res.send('验证成功');
  } else {
    res.status(400).send('验证码错误');
  }
});

增强安全性的措施

  1. 限制验证码尝试次数
  2. 设置验证码有效期(通常2-5分钟)
  3. 使用更复杂的验证方式,如行为验证(拖动滑块、点击特定区域等)
  4. 定期更换验证码生成算法

使用第三方验证码服务

对于高安全性需求,可考虑专业验证码服务:

  • Google reCAPTCHA
  • hCaptcha
  • 腾讯验证码

这些服务通常提供JavaScript集成方式,如reCAPTCHA v2:

<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<div class="g-recaptcha" data-sitekey="your-site-key"></div>

后端需验证返回的token:

const axios = require('axios');

async function verifyRecaptcha(token) {
  const response = await axios.post(
    'https://www.google.com/recaptcha/api/siteverify',
    `secret=your-secret-key&response=${token}`
  );
  return response.data.success;
}

标签: 验证码js
分享给朋友:

相关文章

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…