当前位置:首页 > JavaScript

js实现图片验证码

2026-04-03 19:37:26JavaScript

实现图片验证码的基本思路

图片验证码通常由随机生成的字符或数字组成,经过扭曲、干扰线、噪点等处理后呈现为图像。以下是一个基于JavaScript和Canvas的实现方法:

生成随机字符串

function generateRandomString(length) {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return result;
}

创建Canvas绘制验证码

function createCaptcha() {
  const canvas = document.getElementById('captchaCanvas');
  const ctx = canvas.getContext('2d');
  const captchaText = generateRandomString(6);

  // 清除画布
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  // 设置背景色
  ctx.fillStyle = '#f5f5f5';
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  // 绘制文字
  ctx.font = '30px Arial';
  ctx.fillStyle = '#333';
  ctx.textAlign = 'center';

  // 添加文字扭曲效果
  for (let i = 0; i < captchaText.length; i++) {
    ctx.save();
    ctx.translate(30 + i * 20, 30);
    ctx.rotate((Math.random() - 0.5) * 0.4);
    ctx.fillText(captchaText[i], 0, 0);
    ctx.restore();
  }

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

  // 添加噪点
  for (let i = 0; i < 100; i++) {
    ctx.fillStyle = getRandomColor();
    ctx.fillRect(
      Math.random() * canvas.width,
      Math.random() * canvas.height,
      1,
      1
    );
  }

  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;
}

HTML结构

<div class="captcha-container">
  <canvas id="captchaCanvas" width="200" height="60"></canvas>
  <button id="refreshCaptcha">刷新</button>
</div>
<input type="text" id="captchaInput" placeholder="输入验证码">
<button id="verifyCaptcha">验证</button>

验证逻辑

let correctCaptcha = '';

document.addEventListener('DOMContentLoaded', function() {
  correctCaptcha = createCaptcha();

  document.getElementById('refreshCaptcha').addEventListener('click', function() {
    correctCaptcha = createCaptcha();
  });

  document.getElementById('verifyCaptcha').addEventListener('click', function() {
    const userInput = document.getElementById('captchaInput').value;
    if (userInput === correctCaptcha) {
      alert('验证码正确');
    } else {
      alert('验证码错误');
      correctCaptcha = createCaptcha();
    }
  });
});

增强安全性措施

在实际应用中,纯前端验证码安全性不足,建议配合后端验证:

  1. 生成验证码时,将正确值存储在服务器session中
  2. 用户提交时,将输入值与服务器存储的值比对
  3. 验证码应设置有效期(通常2-5分钟)
  4. 限制单位时间内验证尝试次数

替代方案

对于更高安全需求,可以考虑:

js实现图片验证码

  1. 使用第三方验证码服务(如reCAPTCHA)
  2. 实现滑动拼图验证码
  3. 短信/邮箱验证码验证
  4. 行为分析验证(鼠标移动轨迹等)

标签: 验证码图片
分享给朋友:

相关文章

vue实现图片分析

vue实现图片分析

Vue 实现图片分析的方法 在 Vue 中实现图片分析通常涉及图片上传、预览、后端交互以及分析结果展示等功能。以下是几种常见的实现方式: 使用 HTML5 File API 和 Canvas 进行前…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

vue实现图片闪烁

vue实现图片闪烁

实现图片闪烁效果的方法 在Vue中实现图片闪烁效果可以通过CSS动画或JavaScript动态控制样式。以下是几种常见方法: CSS动画实现 通过@keyframes定义闪烁动画,并应用到图片元素上…

react如何引用图片

react如何引用图片

在React中引用图片的方法 使用import直接引入图片 在React组件中,可以通过import语句将图片作为模块引入。这种方式适合在组件内部使用图片,Webpack会处理图片的路径和打包。 i…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…

js实现图片加载

js实现图片加载

使用Image对象加载图片 通过JavaScript的Image对象可以动态加载图片,适用于需要预加载或动态插入图片的场景。 const img = new Image(); img.src =…