DD373 官网接口风控突破详细分析方式

协议分析 · 昨天 · 66 人浏览
DD373 官网接口风控突破详细分析方式

说明

本文章测试的核心接口为添加购物车的功能。针对Cookie的进行续期。

0.png

已知请求方式为:POST
请求地址:https://goods.dd373.com/api/ShopCart/AddCartShop
请求内容:{"ShopNumber":"DB20260228122718-76464","Count":1}
请求头:cookie:goods.dd373.com=b26aca71-a88c-49a6-b90c-c3490441f969;

在请求头中,他的cookie参数还是挺多的,但实际测试下去,goods.dd373.com的参数实效只有一个小时的时间。本文就是来探讨goods.dd373.com参数应该如何来进行续期。

开始

首先进行登陆,登陆时开启开发者工具,勾选保留日志

1.png

登陆成功之后,他的最底部Cookie是这样的:

imagestylewebp=1; dpushPC=true; acw_tc=0a15e18717722685704137087e5194dfd0d261269dddd9fdb78740a24fef17; new_pc_rememberPassword=1; clientId=xxx; loginToken=xxx; refreshToken=xxx; login.dd373.com=xxx; dpush.dd373.com=xxx; newuser.dd373.com=xxx; thirdbind.dd373.com=xxx; goods.dd373.com=xxx; imservice.dd373.com=xxx

在请求中,可以看到有较多的Save请求,根据上下文中的Cookie可以得到, 此请求基本可以肯定,为保存当前的参数至服务端。客户端做请求时,后台均会判断此Cookie是否为失效。

请求体:
2.png
请求内容:
3.png

而且他们的参数又都是独立,如参数goods.dd373.com,对应的便是此子域名所需要的核心参,其它同理。

dpush.dd373.com=xxx; newuser.dd373.com=xxx; thirdbind.dd373.com=xxx; goods.dd373.com=xxx; imservice.dd373.com=xxx

续期

在Save请求中,点击Initiator(发起程序),可以看到此请求引用了一个js文件。ajax_filter.js
他的具体代码为:https://sta.dd373.com/newfile/common/js/ajax_filter.js?v=202602281521
JS中还带了一些注释。基本大致意思是可以理的通了。

流程

通过JS中,以及我多次试错,基本是发现请求三次请求。
登陆成功之后,自然生成refreshToken,refreshToken为长效token,他最长时间可为30天。
第一个请求,通过此refreshToken来刷新Token值。
第二个请求,通过第一个请求的Token值,来获取ChildToken,此ChildToken为goods.dd373.com=xxx;xxx的这个值。
第三个请求,则是将ChildToken提交到后端。便于接口请求。如果失效,继续执行三次请求进行续期。

第一次请求

//通过refreshToken获取loginToken
function getRefreshToken(refreshToken) {
    var dtd = $.Deferred();
    var data = { 'RefreshToken': refreshToken, 'ClientType': 1, 'RefreshTokenType': 1, 'ClientId': getTokenCookies("clientId") ? getTokenCookies("clientId") : '' };
    if (!getTokenCookies('refreshToken')) {
        data['RefreshTokenType'] = 2;
    }
    //app中打开页面时,需要获取app的ClientType
    if (getTokenCookies('tokenClienType')) {
        data['ClientType'] = getTokenCookies('tokenClienType');
    }
    $.ajax({
        type: "post",
        url: "//login.dd373.com/api/Login/RefreshToken",
        data: JSON.stringify(data),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: false,
        success: function success(data) {
            dtd.resolve(data);
        }
    });
    return dtd;
}

请求地址为:https://login.dd373.com/api/Login/RefreshToken
请求内容为:{"RefreshToken":"xxxxx","ClientType":1,"RefreshTokenType":1,"ClientId":"xxxx"}
RefreshToken与ClientId值的来源为登陆成功之后的Cookie中的参数。咱们做的是续期,并非为登陆,所以这个登陆成功之后取Cookie便可。
他的返回为:

{"StatusCode":"0","StatusMsg":"请求成功","StatusData":{"ResultCode":"0","ResultMsg":"操作成功","ResultData":{"Token":"xxx","TokenExpireDate":"2026-02-28 18:23:50","TokenExpireDateForCST":"Sat, 28 Feb 2026 10:23:50 GMT","TokenRelativeExpireTime":3570,"RefreshToken":"xxx","RefreshTokenExpireDate":"2026-03-30 16:59:33","RefreshTokenExpireDateForCST":"Mon, 30 Mar 2026 08:59:33 GMT","RefreshTokenRelativeExpireTime":2590512,"ClientId":"xxx"}}}

第一个请求中,得到token值,然后进行第二个请求。

第二次请求

//通过loginToken获取域Token
function getDomainToken(loginToken, domain) {
    var dtd = $.Deferred();
    $.ajax({
        type: "get",
        url: '//login.dd373.com/api/Login/GetChildToken',
        data: { 'Token': loginToken, 'ServiceType': domain },
        dataType: 'jsonp',
        success: function success(data) {
            dtd.resolve(data);
        }
    });
    return dtd;
}

请求地址:https://login.dd373.com/api/Login/GetChildToken?Token={token}&ServiceType=goods.dd373.com
token值为上一轮请求所得到的token值。

他的返回为:

{"StatusCode":"0","StatusMsg":"请求成功","StatusData":{"ResultCode":"0","ResultMsg":"操作成功","ResultData":{"ChildToken":"xxx","ChildTokenExpireDate":"2026-02-28 18:27:28","ChildTokenExpireDateForCST":"Sat, 28 Feb 2026 10:27:28 GMT","ChildTokenRelativeExpireTime":3570}}}

上面返回的JSON中,需要得到ChildToken节点,进行第三次请求。其中ChildTokenRelativeExpireTime节点为token值的失效时间。

第三次请求

//保存域Token
function saveDomainToken(domainToken, domain) {
    var dtd = $.Deferred();
    $.ajax({
        type: 'post',
        url: '//' + domain + '/api/Token/Save',
        data: JSON.stringify({ 'ChildToken': domainToken }),
        dataType: "json",
        contentType: "application/json",
        success: function success(data) {
            if (data.ResultCode == 0) {
                dtd.resolve(data);
            }
        }
    });
    return dtd;
}

因为我只需要网站的添加购物车的这个协议,而此操作所需要的cookie节点为:goods.dd373.com,所以请求为:
https://goods.dd373.com/api/Token/Save
请求内容为:
{"ChildToken":"xxx"}

他的返回为:
{"StatusCode":"0","StatusMsg":"请求成功","StatusData":{"ResultCode":"0","ResultMsg":"操作成功","ResultData":{}}}

第三个请求成功之后,此续期流程结束。下次如果cookie中的goods.dd373.com参数失效,继续重复上述三次请求,继续进行续期。