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

前言

开发者采用腾讯云短信做短信注册登陆验证码时,注册登陆页面暴露在外网给用户使用。恶意分子会利用从网站上找到的短信发送 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 删除。

编辑于

短信防刷

1 篇文章2 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

golang基于redis lua封装的优先级去重队列

前言: 前两天由于某几个厂商的api出问题,导致后台任务大量堆积,又因为我这边任务流系统会重试超时任务,所以导致队列中有大量的重复任务。这时候我们要临时解决两个...

3559
来自专栏芋道源码1024

Java 应用中的日志

作为日志产生的日期和时间,这个数据非常重要,一般精确到毫秒。由于一般按天滚动日志文件,日期不需要放在这个时间中,使用 HH:mm:ss.SSS 格式即可。

843
来自专栏技术博文

php性能监测模块XHProf

一,什么是XHProf XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。一个函数的开销,可...

3518
来自专栏Python中文社区

Python云计算框架:OpenStack源码分析之RabbitMQ(二)

之前发布的文章因为在编辑后代码部分在手机上看不清已被及时删除,本文重新编辑好之后再发布一次,带来不便请谅解! 專 欄 ❈ ZZR,Python中文社区专栏作者...

2199
来自专栏思考的代码世界

Python网络数据采集之使用API|第03天

百度百科关于API的解释:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序...

4447
来自专栏思考的代码世界

Python网络数据采集之使用API|第03天

1374
来自专栏贾老师の博客

【译】进程的内存剖析

1475
来自专栏信安之路

一个病毒样本分析的全过程

SHA1: 3f738735bb0c5c95792c21d618eca8c0d5624717

830
来自专栏Golang语言社区

golang基于redis lua封装的优先级去重队列

作者: 峰云 博客: http://xiaorui.cc 前言: 前两天由于某几个厂商的api出问题,导致后台任务大量堆积,又因为我这边任务流系统会重试超时任务...

3719
来自专栏Java成长之路

jsonp详解

说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义...

1114

扫码关注云+社区