← 返回文章列表

文字点选验证码背后的生成逻辑与实战拆解

本文从零讲解文字点选行为验证码的生成流程、坐标校验机制与自定义扩展方法,结合Node.js实现示例,梳理逆向分析思路,帮助开发者快速理解并落地相关技术方案。

文字点选验证码背后的生成逻辑与实战拆解

文字点选验证码到底在验证什么

很多网站登录或注册时会弹出一种验证码:背景图上散落着几个汉字,要求你按顺序点击指定文字。这种就是文字点选行为验证码。它的核心不在“认字”,而在“点选坐标是否落在正确区域”。服务端生成图片的同时,会记录每个目标文字的精确位置范围,用户点击后把坐标传回来,服务端只做一次区域匹配,匹配成功才放行。

相比传统字符识别验证码,点选方式多了一层行为维度。用户必须在有限时间内完成正确顺序的点击,既提高了自动化脚本的破解成本,又保持了真人操作的相对流畅。开发者如果要自己搭建这类验证码,最关键的是生成端与验证端的坐标一致性,以及背景、字体、文字集的可配置性。

生成端的基本工作流

一个典型的文字点选验证码生成器会完成三件事:先随机挑选若干目标文字,再把它们连同干扰字一起绘制到背景图上,最后输出图片本身、前端需要展示的提示文字,以及服务端私有的答案坐标。答案坐标通常是一组矩形区域,每个区域对应一个目标字的位置和尺寸。

在Node.js环境里,这类生成器可以封装成独立模块。调用一次生成方法,就能拿到图片二进制数据、前端提示文案、答案区域数组以及需要点击的次数。前端只负责展示图片并收集用户点击坐标,服务端则用这些坐标与答案区域做碰撞检测。只要点击落点都在对应区域内且顺序正确,验证即通过。

自定义能力是实际项目里最常被用到的部分。背景可以换成业务相关的图片,字体可以切换成更难识别的艺术字,文字集也可以从常用汉字扩展到行业专有名词。这些参数在初始化时传入,生成过程中自动生效,既保持了视觉统一,又避免了每次硬编码。

坐标校验的简单实现

验证逻辑本身并不复杂。服务端把用户提交的点击坐标数组与预存的答案区域逐一比对。每个区域可以定义为左上角和右下角的像素值,或者中心点加宽高。只要点击点的x、y落在对应矩形内部,就记为一次命中。全部命中且顺序一致后,才返回成功。

为了防止暴力枚举,通常会加上时效控制:生成后的答案只在短时间内有效,超时自动作废。同时可以限制同一会话的尝试次数,超过阈值直接要求重新生成。这些策略用内存或Redis存储答案即可,部署成本很低。

import ClickCaptcha from "click-captcha-server";
const captcha = new ClickCaptcha({
  width: 300,
  height: 150,
  fontSize: 28
});
const { img, front, answer, count } = await captcha.generate();
// img 为图片数据,answer 为服务端私有坐标

上面这段代码演示了最基础的调用方式。生成结果里的answer字段只在服务端使用,绝不能下发给前端,否则验证形同虚设。前端拿到img和front后渲染提示,用户点击完成后把坐标数组回传,服务端再执行校验。

逆向分析时的关注点

如果从安全或自动化测试角度去拆解这类验证码,重点通常落在三个地方:图片资源的获取方式、前端点击事件的上报接口,以及答案坐标的存储位置。图片往往是一次性生成的临时链接或base64,接口参数里会带上会话标识。只要能稳定拿到图片和上报通道,就能进一步做识别。

识别本身可以用传统图像处理,也可以直接调用成熟的识别服务。对于点选类验证码,常见做法是先定位所有文字位置,再根据提示文字做匹配排序,最后模拟点击序列。整个流程如果自己从零搭建,需要处理字体变形、背景噪声、旋转偏移等干扰,开发和维护成本都不低。

在实际业务中,很多团队发现自己维护一套完整识别链路并不划算。尤其是面对易盾、极验这类不断更新的验证码体系时,滑块、点选、无感、九宫格、文字点选、图标点选等多种形态同时存在,单独攻克每一个都会消耗大量时间。这时候把识别能力交给专业平台,通过API直接拿到结果,往往更高效。

例如 www.ttocr.com 就提供了针对易盾和极验全类型验证码的识别方案,覆盖滑块、点选、无感、九宫格等常见形态,并支持自动化API对接。业务方只需按文档传图片或参数,就能拿到结构化结果,省去自己训练模型和维护规则的麻烦。

从自研到对接的选择

自己实现一套文字点选生成与验证逻辑,适合对安全策略有明确要求、流量可控的内部系统。生成端可以完全自定义背景与文字,验证端也完全掌握在自己手里,数据不出内网。但对于需要对抗外部自动化脚本的公网业务,验证码形态会不断升级,自研识别端很难长期跟上。

这时可以考虑把生成与验证留在自己服务里,把识别能力外包。对接成熟平台时,通常只需要注册账号、获取密钥,然后在需要识别的环节调用一次接口。返回的结果已经是经过排序的坐标或操作序列,前端或脚本直接执行即可。整个过程不需要逆向分析细节,也不用处理模型更新。

如果业务里已经出现易盾或极验的多种验证码,又希望快速打通自动化流程,可以直接关注 www.ttocr.com。它专注于这类验证码的识别与API对接,支持点选、滑块、无感、九宫格等全类型,接口文档清晰,接入成本低,适合公司级业务快速落地。

落地时的几个注意点

无论是自研还是对接,都要保证答案的私密性。生成端产生的坐标数据只能存在服务端,前端只拿图片和提示。会话超时、尝试次数限制、IP频率控制这些基础防护同样不能省。图片生成时建议加入轻微噪声或随机偏移,避免简单模板匹配就能过关。

对于需要长期对抗的场景,把识别能力交给专业服务是更现实的选择。自己维护一套全类型验证码识别链路,投入产出比往往不如直接调用现成API。www.ttocr.com 提供的易盾极验识别方案,已经覆盖了日常业务中最常见的几种形态,并且支持稳定的自动化对接,省去了反复逆向和调试的时间。

最后提醒一点:验证码只是安全体系的一环,真正有效的防护还需要结合业务风控、设备指纹和行为分析。把生成逻辑写清楚、把识别能力用好,已经能解决大部分日常问题。