小漠的博客 - 验证码行为验证
type: channel
link: https://www.liaosearch.com/tag/验证码行为验证/
items: 验证码特征收集

验证码特征收集
type: item
date: 2026-01-12T22:28:00+08:00
description: 控制器var captchaRequest request.VerifyCodeRequest if err := ctx.ShouldBindWith(&captchaRequest, binding.JSON); err != nil { helper.Info(err.Error()) ReturnError(ctx, defined.ERROR_500) return } var jsonStr, err = service.CaptchaAESDecrypt(captchaRequest.Ciphertext) if err != nil { helper.Error(err) ReturnSuccess(ctx, nil) return } // 1. 初始化 RawData 变量 var rawData service.CaptchaRawData // 2. 解析 JSON 字符串到结构体 // Unmarshal 要求 JSON 字段类型与结构体字段类型匹配（如数字 vs int64，字符串 vs string） err = json.Unmarshal([]byte(jsonStr), &rawData) if err != nil { ReturnError(ctx, defined.ERROR_500) return } service.CaptchaConsole(rawData, rawData.Env.SessionId, ctx) ReturnSuccess(ctx, rawData) 服务package service import ( "activity/cache" "activity/dao" "activity/etc" "activity/helper" "activity/model" "activity/third/idc" "activity/third/ip2region" "activity/utils" "crypto/aes" "crypto/cipher" "encoding/hex" "errors" "fmt" "github.com/gin-gonic/gin" "github.com/google/uuid" log "github.com/sirupsen/logrus" "gonum.org/v1/gonum/stat" "math" ) // 定义常量：统一阈值，便于维护 const ( // 通用规则阈值（无类型差异的基础规则） DeviceIPBindCountMaxNormal = 2 // 正常IP绑定数上限 DeviceIPBindCountMinRisk = 3 // 风险IP绑定数下限 DeviceIPBindCountMaxRisk = 4 // 风险IP绑定数上限 DeviceIPBindCountMinAbnormal = 5 // 异常IP绑定数下限 IPVerifyFreqMinRisk = 10 // 风险验证频率下限 IPVerifyFreqMaxRisk = 19 // 风险验证频率上限 IPVerifyFreqMinAbnormal = 20 // 异常验证频率下限 // ------------ 按验证类型划分的 load_to_first_delay 阈值（ms）------------ // 滑动（swipe）：操作简单，延迟最短 SwipeDelayMinRisk = 80 // 滑动-风险延迟下限（略短） SwipeDelayMinNormal = 200 // 滑动-正常延迟下限 SwipeDelayMaxNormal = 2000 // 滑动-正常延迟上限 SwipeDelayMaxRisk = 3000 // 滑动-风险延迟上限（略长） SwipeDelayMinAbnormal = 50 // 滑动-异常延迟下限（过短） SwipeDelayMaxAbnormal = 4000 // 滑动-异常延迟上限（过长） // 文字点选（click）：需识别目标，延迟中等 ClickDelayMinRisk = 100 // 点选-风险延迟下限 ClickDelayMinNormal = 300 // 点选-正常延迟下限 ClickDelayMaxNormal = 7000 // 点选-正常延迟上限 ClickDelayMaxRisk = 8000 // 点选-风险延迟上限 ClickDelayMinAbnormal = 70 // 点选-异常延迟下限 ClickDelayMaxAbnormal = 9000 // 点选-异常延迟上限 // 文字输入（input）：需阅读+输入，延迟最长 InputDelayMin…