当前位置:首页 > JavaScript

js验证码实现

2026-01-16 12:31:36JavaScript

验证码的基本原理

验证码(CAPTCHA)用于区分人类用户和自动化程序。常见类型包括图形验证码、滑动验证码、短信验证码等。JavaScript 可用于前端验证码的生成和验证逻辑。

图形验证码实现

使用 Canvas 生成随机字符验证码:

function generateCaptcha() {
  const canvas = document.getElementById('captchaCanvas');
  const ctx = canvas.getContext('2d');
  const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
  let captcha = '';

  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.fillStyle = '#f0f0f0';
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  for (let i = 0; i < 6; i++) {
    const char = chars.charAt(Math.floor(Math.random() * chars.length));
    captcha += char;
    ctx.font = '30px Arial';
    ctx.fillStyle = getRandomColor();
    ctx.fillText(char, 10 + i * 25, 30);
  }

  // 添加干扰线
  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 captcha;
}

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

验证逻辑处理

在表单提交时验证用户输入:

let currentCaptcha = generateCaptcha();

document.getElementById('refreshCaptcha').addEventListener('click', function() {
  currentCaptcha = generateCaptcha();
});

document.getElementById('submitForm').addEventListener('submit', function(e) {
  e.preventDefault();
  const userInput = document.getElementById('captchaInput').value;

  if (userInput.toUpperCase() === currentCaptcha) {
    alert('验证码正确');
    // 继续表单提交
  } else {
    alert('验证码错误');
    currentCaptcha = generateCaptcha();
  }
});

滑动验证码实现

基本滑动验证码的 HTML 结构:

<div class="slider-container">
  <div class="slider-bg"></div>
  <div class="slider-btn" draggable="true"></div>
</div>

JavaScript 拖动逻辑:

const sliderBtn = document.querySelector('.slider-btn');
let isDragging = false;

sliderBtn.addEventListener('mousedown', function(e) {
  isDragging = true;
});

document.addEventListener('mousemove', function(e) {
  if (!isDragging) return;

  const container = document.querySelector('.slider-container');
  const containerRect = container.getBoundingClientRect();
  let newPosition = e.clientX - containerRect.left;

  // 限制滑块在容器内移动
  newPosition = Math.max(0, Math.min(newPosition, containerRect.width - sliderBtn.offsetWidth));

  sliderBtn.style.left = newPosition + 'px';
});

document.addEventListener('mouseup', function(e) {
  if (!isDragging) return;
  isDragging = false;

  // 验证是否滑动到指定位置(如右侧80%区域)
  const container = document.querySelector('.slider-container');
  const containerWidth = container.offsetWidth;
  const btnPosition = parseInt(sliderBtn.style.left || 0);

  if (btnPosition > containerWidth * 0.8) {
    alert('验证成功');
  } else {
    sliderBtn.style.left = '0';
  }
});

短信验证码倒计时

发送短信验证码时的倒计时功能:

function startCountdown(seconds) {
  const btn = document.getElementById('sendSmsBtn');
  let remaining = seconds;

  btn.disabled = true;
  btn.textContent = `重新发送(${remaining}s)`;

  const timer = setInterval(() => {
    remaining--;
    btn.textContent = `重新发送(${remaining}s)`;

    if (remaining <= 0) {
      clearInterval(timer);
      btn.disabled = false;
      btn.textContent = '发送验证码';
    }
  }, 1000);
}

document.getElementById('sendSmsBtn').addEventListener('click', function() {
  // 模拟发送验证码
  startCountdown(60);
});

安全注意事项

前端验证码只能作为辅助验证,服务端必须进行二次验证。验证码生成逻辑应包含:

  • 随机性足够强(避免简单数学运算)
  • 会话绑定(每个验证码对应特定会话)
  • 有效期限制(通常3-5分钟)
  • 尝试次数限制(防止暴力破解)

服务端验证示例(Node.js):

js验证码实现

const sessionCaptchas = {};

// 生成验证码时存储
app.post('/api/captcha/generate', (req, res) => {
  const captcha = generateRandomString();
  const sessionId = req.session.id;
  sessionCaptchas[sessionId] = {
    code: captcha,
    expires: Date.now() + 300000 // 5分钟后过期
  };
  res.json({ captchaImage: generateImage(captcha) });
});

// 验证验证码
app.post('/api/captcha/verify', (req, res) => {
  const { input, sessionId } = req.body;
  const record = sessionCaptchas[sessionId];

  if (!record || record.expires < Date.now()) {
    return res.status(400).json({ error: '验证码已过期' });
  }

  if (input.toUpperCase() !== record.code) {
    return res.status(400).json({ error: '验证码错误' });
  }

  delete sessionCaptchas[sessionId];
  res.json({ success: true });
});

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

相关文章

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…