腾讯云短信图片验证码防刷接入指引

前言

开发者采用腾讯云短信做短信注册登陆验证码时,注册登陆页面暴露在外网给用户使用。恶意分子会利用从网站上找到的短信发送 URL ,发送 HTTP 请求,每次请求给用户发送一个验证码短信,从而给开发者带来不必要的损失。一般的防刷方案有:增加图形验证单、IP请求次数限制、限制号码发送。本文介绍如何在接入腾讯云短信的基础上再通过几个接口调用快速的接入图片验证码,为开发者的短信发送保驾护航。文中如有不明确的地方,可以联系腾讯云短信小助手(QQ:3012203387)沟通。

滑动图片验证码

一、交互流程

交互流程

前三步为图片验证码相关,第四步按短信接入指引接入,下节对前三步所需的接口进行说明

注:开发者需要自己存session记录发短信直接的图片验证状态,否则恶意仍可以绕过前三步直接调用短信发送接口。

二、接口说明

1、检查是否需要验证码

接口描述

根据前端传递的相关参数判断是否需要开启图片验证码防刷流程 URL 示例

https://yun.tim.qq.com/v5/smssecurity/preventmalicious?sdkappid=xxxx&random=xxxx

:sdkappid 请填写您在腾讯云短信控制台上申请,random 请填成随机数。

请求参数

{
"sectype": 2,
"tel": {
     "nationcode":"86",
"mobile":"13788888888"
},
"clientip": "1.1.1.1",
"sig":"ecab4881ee80ad3d76bb1da68387428ca752eb885e52621a3129dcf4d9bc4fd4",
"time": "1457336869,
"ext": , ""
}

参数

必选

类型

描述

sectype

number

1注册、2登录、3活动类,非注册登录类型都归为活动类

tel

object

手机号码号码

clientip

string

客户前端的出口ip

sig

string

App 凭证,具体计算方式见下注

time

number

请求发起时间,unix 时间戳(单位:秒),如果和系统时间相差超过 10 分钟则会返回失败

ext

string

用户自定义,回包时原样返回

参数tel :

参数

必选

类型

描述

nationcode

string

国家码

mobile

string

手机号码

注:"sig" 字段根据公式 sha256

(appkey=$appkey&random=$random&time=$time&mobile=$mobile)生成。

伪代码如下:

string strMobile = "13788888888"; //tel 的 mobile 字段的内容
string strAppKey = "5f03a35d00ee52a21327ab048186a2c4"; //sdkappid 对应的 appkey,需要业务方高度保密
string strRand = "7226249334"; //url 中的 random 字段的值
string strTime = "1457336869"; //unix 时间戳
string sig = sha256(appkey=5f03a35d00ee52a21327ab048186a2c4&random=7226249334&time=1457336869&mobile=13788888888)
       = ecab4881ee80ad3d76bb1da68387428ca752eb885e52621a3129dcf4d9bc4fd4;

响应参数

{
"result": 0,
"ext": , ""
"errmsg": "OK"
}

参数

必选

类型

描述

result

number

错误码。0标识正常,非0表示需要弹验证码

ext

string

请求包带过来的,回包时原样返回

errmsg

string

错误原因

2、拉图片验证码

接口描述

拉图片验证码用于展示给用户验证。

a、在Head的标签内最后加入以下代码引入验证JS文件(建议直接在html中引入)

<script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>

b、在你想要激活验证码的DOM元素(eg. button、div、span)内加入以下id及属性

<!--点击此元素会自动激活验证码-->
<!--id : 元素的id(必须)-->
<!--data-appid : AppID(必须)-->
<!--data-cbfn : 回调函数名(必须)-->
<!--data-biz-state : 业务自定义透传参数(可选)-->
<button id="TencentCaptcha"
        data-appid="2028863697"
        data-cbfn="callback"
>验证</button>

c、为验证码创建回调函数,注意函数名要与data-cbfn相同

window.callback = function(res){
    console.log(res)
    // res(未通过验证)= {ret: 1, ticket: null}
    // res(验证成功) = {ret: 0, ticket: "String", randstr: "String"}
    if(res.ret === 0){
        alert(res.ticket)   // 票据
    }
}

完成以上操作后,点击激活验证码的元素,即可弹出验证码。

这里有个demo

请求参数:

参数

必选

类型

描述

data-appid

number

场景id,需要联系smshelper(qq: 3012203387)申请

响应参数:

用用户完成图片验证码的验证后回返回如下重要参数

参数

必选

类型

描述

randstr

string

随机数,“验证图片ticket“的时带给腾讯云

ticket

string

生成的票据,“验证图片ticket“的时带给腾讯云

3、拉图片验证码定制接入

接口描述

拉图片验证码”接口只是静态的实现了图片验证码的弹出,如果需要自定义一些行为,可以参考本节提供的函数接口。

验证码会在全局注册一个TencentCaptcha类,业务方可以使用这个类自行初始化验证码,并对验证码进行显示或者隐藏。默认的,验证码的js(TCaptcha.js)在加载完成后会检测页面中是否存在id="TencentCaptcha"的元素,如果有则会自动将验证码的触发事件绑定在该元素上。如不希望默认绑定请避免使用id="TencentCaptcha"的元素。

构造函数

TencentCaptcha支持多种参数的重载。

1. 手动初始化

new TencentCaptcha(appId, callback, options);

参数说明:

appId:String, 申请的场景Id

callback:Function, 回调函数

options:Object, 更多配置参数, 详见配置参数

2. 绑定到一个元素

new TencentCaptcha(element);

参数说明:

element: HTMLElement, 验证码将绑定click事件到该元素上。该方式需要确保元素上有data-appid和data-cbfn属性

3. 绑定到一个元素

new TencentCaptcha(element, appId, callback, options);

参数说明:

element: HTMLElement, 需要绑定click事件的元素

appId: String, 申请的场景Id

callback: Function, 回调函数

options: Object, 更多配置参数, 详见配置参数

示例代码

// 直接生成一个验证码对象
var captcha1 = new TencentCaptcha('appid', function(res) {/* callback */});
captcha1.show(); // 显示验证码
// 绑定一个元素并手动传入场景Id和回调
new TencentCaptcha(
    document.getElementById('TencentCaptcha'),
    'appid',
    function(res) {/* callback */},
    { bizState: '自定义透传参数' }
);

// 绑定一个元素并自动识别场景id和回调

// 验证码会读取dom上的`data-appid`和`data-cbfn`以及`data-biz-state`(可选)自动初始化

new TencentCaptcha(document.getElementById('TencentCaptcha'));

回调内容

前端验证成功会验证码会调用业务传入的回调函数,并在第一个参数中传入回调结果。结果字段说明如下:

字段名

值类型

说明

ret

Int

验证结果,0-验证成功,2-用户主动关闭验证码

ticket

String

验证成功的票据,当且仅当ret=0时ticket有值

appid

String

场景Id

bizState

Any

自定义透传参数

实例方法

TencentCaptcha的实例提供一些常用操作验证码的方法:

方法名

说明

传入参数

返回内容

show

显示验证码

destroy

隐藏验证码

getTicket

获取验证码验证成功后的ticket

Object:{"appid":"","ticket":""}

*show与destroy可以反复调用

配置参数

options提供以下配置参数:

配置名

值类型

说明

bizState

Any

自定义透传参数,业务可用该字段传递少量数据,该字段的内容会被带入callback回调的对象中

4、验证图片ticket

接口描述

通过验证ticket来确定是否为合法用户 URL 示例

https://yun.tim.qq.com/v5/smssecurity/ticketverify?sdkappid=xxxx&random=xxxx

:sdkappid 请填写您在腾讯云短信控制台上申请,random 请填成随机数。

请求参数

{
 "dataappid":2028863697,
 "appsecretkey": "xxxxx",
 "ticket": "tiket",
"randstr":"randstr",
"ext":"",
"time":1457336869,
"tel": {
     "nationcode":"86",
"mobile":"13788888888"
},
"clientip":"1.1.1.1"
}

参数

必选

类型

描述

dataappid

number

场景id,需要与“拉图片验证码”时的data-appid相同,注意这里的字段名不带 “-“

tel

object

手机号码号码

clientip

string

客户前端的出口ip

ticket

string

手动完成图片验证后生成的票据

appsecretkey

string

场景id对应的密钥,需要联系smshelper(qq: 3012203387)申请

randstr

string

“拉图片验证码”手动验证成功生成的randstr

sig

string

App 凭证,具体计算方式见下注

time

number

请求发起时间,unix 时间戳(单位:秒),如果和系统时间相差超过 10 分钟则会返回失败

ext

string

用户自定义,回包时原样返回

注:"sig" 字段根据公式 sha256

(appkey=$appkey&random=$random&time=$time&mobile=$mobile)生成。

伪代码如下:

string strMobile = "13788888888"; //tel 的 mobile 字段的内容
string strAppKey = "5f03a35d00ee52a21327ab048186a2c4"; //sdkappid 对应的 appkey,需要业务方高度保密
string strRand = "7226249334"; //url 中的 random 字段的值
string strTime = "1457336869"; //unix 时间戳
string sig = sha256(appkey=5f03a35d00ee52a21327ab048186a2c4&random=7226249334&time=1457336869&mobile=13788888888)
       = ecab4881ee80ad3d76bb1da68387428ca752eb885e52621a3129dcf4d9bc4fd4;

参数tel :

参数

必选

类型

描述

nationcode

string

国家码

mobile

string

手机号码

响应参数

{
"result": 0,
"ext":"",
"errmsg": "OK"
}

参数

必选

类型

描述

result

number

错误码。0表示校验成功,非0表示检验失败

ext

string

请求包带过来的,回包时原样返回

errmsg

string

错误原因

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏超然的博客

BAT 前端开发面经 —— 吐血总结

最近暑期实习招聘已经开始,个人目前参加了阿里的内推及腾讯和百度的实习生招聘,在此总结一下 一是备忘、总结提升,二是希望给大家一些参考 其他面试及基础相关可以...

2632
来自专栏信安之路

初探密码破解工具JTR

JTR是John The Ripper的缩写本身是用来专门破解linux系统用户hash的,但现在已经不再那么局限了,它同样也提供了非常多的散列类型,虽然,跟h...

3320
来自专栏吴老师移动开发

[Flutter]md5加密

6142
来自专栏向治洪

Mpg123源代码详解

Mpg123与libmad一样,支持mpeg1,2,2.5音频解码。目前来看mpg123比libmad支持了网络播放功能。而且libmad基本上开源社区在200...

2267
来自专栏非典型技术宅

Swift多线程:使用Thread进行多线程间通讯,协调子线程任务1. Thread的三种建立方式2. Thread的基本使用3. 使用NSCondition实现线程间通讯4. pthread

2112
来自专栏C/C++基础

CVTE2017秋季校招笔试题回忆(C++后台岗)

2016.09.06晚参加了CVTEC++岗的在线笔试。笔试题型分为不定向选择题和编程题,总共27题。其中不定项选择题为25道,编程题2道。其特点是不定项选择题...

1121
来自专栏月牙寂

[以太坊源代码分析] V. 从钱包到客户端

本文转载来源自:http://blog.csdn.net/teaspring/article/details/78350888 感谢原作者teaspring...

4243
来自专栏Java架构师进阶

Java 10 新特性全览

在 Java 9 之后,Java 将采用基于时间发布的策略,每 6 个月一个版本。目前,Java 10 的新特性都已经确定。

914
来自专栏小樱的经验随笔

CTF---Web入门第七题 猫抓老鼠

猫抓老鼠分值:10 来源: 实验吧 难度:难 参与人数:8697人 Get Flag:3740人 答题人数:3944人 解题通过率:95% catch!catc...

3475
来自专栏小灰灰

Spring定时任务高级使用篇

前面一篇博文 《Spring之定时任务基本使用篇》 介绍了Spring环境下,定时任务的简单使用姿势,也留了一些问题,这一篇则希望能针对这些问题给个答案

1372

扫码关注云+社区

领取腾讯云代金券