2557 字
约 8 分钟
2
滑块验证码设计与实现原理:从原理到工程落地

滑块验证码设计与实现原理:从原理到工程落地

在互联网应用中,登录、注册、评论、短信发送等接口经常会面临一种安全问题:

如何判断当前操作是真实用户行为,而不是自动化脚本?

例如:

  • 黑客通过脚本不断尝试用户名密码;
  • 爬虫批量注册账号;
  • 恶意程序刷接口;
  • 自动化工具批量提交请求。

如果没有任何防护:

攻击脚本

   |
   |

登录接口

   |

不断尝试账号密码

服务器很容易遭受:

  • 暴力破解
  • 撞库攻击
  • 恶意请求

因此,验证码成为互联网系统中非常重要的一层安全防线。

传统验证码已经逐渐无法满足需求,于是出现了更加智能的:

行为验证码(Behavior CAPTCHA)

其中最典型的就是:

滑块验证码。

本文将从:

  • 验证码发展历程
  • 滑块验证码原理
  • 系统设计
  • 后端实现思路
  • 安全校验机制
  • 工程实践

几个方面进行总结。


1. 验证码的发展历程

验证码的核心目标:

区分真人用户和自动化程序。

简单来说:

人

↓

正常操作


机器

↓

自动执行

1.1 文字验证码

最早的验证码:

A8D92

用户输入图片中的字符。

流程:

生成随机字符串

↓

图片扭曲

↓

用户输入

↓

后台校验

优点:

  • 实现简单
  • 成本低

缺点:

随着 OCR 技术发展:

验证码图片

↓

OCR识别

↓

自动破解

安全性越来越低。


1.2 图片识别验证码

例如:

请选择包含汽车的图片

流程:

服务器生成图片

↓

用户点击目标

↓

后台判断

相比文字验证码:

安全性更高。

但是问题:

  • 用户体验较差
  • 图片识别成本高
  • 对特殊用户不友好

1.3 短信验证码

例如:

您的验证码:

382911

优点:

  • 安全性较高

缺点:

  • 成本高
  • 用户操作流程长
  • 依赖短信渠道

1.4 行为验证码

近年来更加流行:

例如:

  • 滑块验证码
  • 文字点选验证码
  • 点击验证码

核心思想:

不只是验证答案。

而是分析:

用户完成任务过程中的行为是否像真人。

例如:

真人拖动:

开始

↓

加速

↓

减速

↓

微调

↓

完成

机器人:

开始

↓

匀速移动

↓

结束

两者行为存在明显区别。


2. 什么是滑块验证码?

滑块验证码是一种:

基于图片拼图 + 用户行为轨迹分析的人机验证方式。

用户看到:

+----------------+
|                |
|      缺口      |
|                |
+----------------+

      [====]
       滑块

用户需要:

拖动滑块:

滑块

    ↓

移动到缺口位置

验证成功:

允许登录

失败:

重新验证

3. 滑块验证码核心组成

一个完整滑块验证码包含几个核心元素。

3.1 背景图片

例如:

background.png

完整图片:

+----------------+
|                |
|                |
|                |
+----------------+

3.2 滑块图片

服务器随机截取:

+----+
|    |
|块  |
+----+

作为用户拖动对象。


3.3 缺口位置

服务器在背景图随机挖一个位置:

+----------------+
|                |
|      []        |
|                |
+----------------+

保存:

{
"x":230,
"y":80
}

这个坐标就是:

正确答案。


3.4 用户轨迹

前端记录:

用户拖动过程:

[
 {
  "x":10,
  "y":20,
  "time":100
 },
 {
  "x":50,
  "y":22,
  "time":200
 }
]

包含:

  • x坐标
  • y坐标
  • 时间
  • 移动速度

用于判断是否真人。


4. 滑块验证码整体流程

整个流程:

用户打开登录页

        |
        |

请求验证码

        |
        |

后端生成验证码

        |
        |

返回图片+唯一ID

        |
        |

用户拖动滑块

        |
        |

前端记录轨迹

        |
        |

提交验证结果

        |
        |

后端校验

        |
        |

成功/失败

5. 后端验证码生成流程

第一步:随机选择图片

图片池:

image1.jpg

image2.jpg

image3.jpg

随机选择:

image2.jpg

第二步:生成随机缺口

例如:

图片大小:

300 * 200

随机:

x = 180

y = 90

第三步:裁剪滑块

原图:

+----------------+
|                |
|       []       |
|                |
+----------------+

裁剪:

+----+
| [] |
+----+

得到:

滑块图片。


第四步:保存验证数据

例如 Redis:

key:

captcha:10001

value:

{
"x":180,
"y":90,
"expire":120
}

为什么保存 Redis?

因为:

验证码属于临时数据。

特点:

  • 生命周期短
  • 查询频繁
  • 自动过期

6. 验证接口设计

6.1 获取验证码

接口:

GET /captcha/generate

返回:

{
 "captchaId":"10001",

 "background":
 "/img/bg.png",

 "slider":
 "/img/block.png"
}

客户端展示。


6.2 校验验证码

接口:

POST /captcha/check

请求:

{
 "captchaId":"10001",

 "x":182,

 "track":[
   {
    "x":10,
    "time":100
   }
 ]
}

服务器校验:

主要两部分。


7. 坐标校验

核心:

比较:

用户拖动距离

VS

真实缺口位置

例如:

服务器:

targetX=180

用户:

moveX=182

误差:

|182-180|

=2

如果:

误差 <= 5px

认为通过。

代码思想:

if(Math.abs(userX-targetX)<threshold){

    success();

}

8. 行为轨迹校验

只验证坐标是不安全的。

因为机器人可以:

直接计算:

缺口位置

↓

直接移动

因此需要分析轨迹。


真人轨迹特点

1. 非匀速

真人:

慢

↓

快

↓

慢

机器人:

速度恒定

2. 存在停顿

例如:

移动

暂停

调整

完成

3. 有轻微抖动

真人:

100

102

101

103

机器人:

100

101

102

103

4. 移动时间合理

例如:

0.1秒完成:

可能是机器人

5秒:

更像真人

9. 为什么需要二次校验?

很多验证码:

第一次:

图片验证成功

并不代表:

一定是真人

攻击者可能:

  • 破解图片
  • 模拟接口调用

所以通常:

验证码通过后:

生成一次性 Token。

例如:

Redis:

captcha_pass_token:

abc123

登录接口:

必须携带:

captchaToken

否则拒绝。

流程:

验证码

↓

生成token

↓

登录接口携带token

↓

允许登录

这就是:

验证码二次校验。


10. 技术选型

实现滑块验证码通常有三种方式。

方案一:自研

自己实现:

  • 图片处理
  • 缺口生成
  • 前端组件
  • 风控算法

优点:

完全控制。

缺点:

成本高。

适合:

大型安全团队。


方案二:第三方服务

例如:

  • 极验验证码
  • 阿里云验证码
  • 腾讯云验证码

优点:

安全能力强。

缺点:

收费。

数据经过第三方。

适合:

商业项目快速上线。


方案三:开源方案

例如 Java 项目:

  • Tianai-Captcha
  • AJ-Captcha

优点:

免费。

可以二次开发。

缺点:

需要自己维护。

适合:

学习项目、中小系统。


11. 滑块验证码在登录系统中的应用

一个完整登录流程:

用户输入账号密码

        |

完成滑块验证码

        |

获取captchaToken

        |

提交登录请求

        |

后端验证token

        |

账号密码校验

        |

登录成功

安全层:

第一层:

验证码防机器人


第二层:

账号密码认证


第三层:

登录风控

12. 滑块验证码的安全问题

滑块验证码并不是绝对安全。

攻击方式包括:

1. 图片识别攻击

攻击者:

识别缺口位置

↓

自动移动

解决:

增加:

  • 行为检测
  • 风控评分

2. 模拟轨迹攻击

攻击者模拟:

随机抖动

解决:

结合:

  • IP
  • 用户历史行为
  • 请求频率

3. 接口重放

攻击者重复提交:

旧验证码。

解决:

验证码:

  • 一次性使用
  • 设置过期时间

13. 实际项目架构设计

在一个 Spring Boot 项目中:

前端

 |

验证码组件

 |

CaptchaController

 |

CaptchaService

 |

Redis

 |

图片处理模块


登录:

LoginController

 |

CaptchaService

 |

UserService


总结

滑块验证码本质上解决的是:

如何证明当前请求来自真实用户,而不是自动化程序。

它相比传统验证码:

文字验证码

↓

识别答案


滑块验证码

↓

验证行为

核心流程:

生成图片

↓

随机生成缺口

↓

用户拖动

↓

记录轨迹

↓

坐标校验

↓

行为分析

↓

生成验证Token

工程实践中:

普通项目:

开源方案
+
Redis
+
二次校验

即可满足需求。

大型系统:

验证码

+

设备指纹

+

IP风控

+

行为分析

+

机器学习模型

共同组成完整的反机器人安全体系。

一句话总结:

滑块验证码不是验证用户是否知道答案,而是通过分析用户完成任务的过程,判断这个操作是不是像一个真实的人。

滑块验证码设计与实现原理:从原理到工程落地
http://www.clxhxhhr.top/posts/405/
作者
clxstart
发布于
2026-09-01
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。