概述

API基础信息

Base URL: https://yanzheng.6vps.net/api

请求方式: POST

数据格式: JSON

字符编码: UTF-8

通用返回格式
{
    "code": 1,
    "msg": "操作成功",
    "data": {}
}

参数说明:

  • code: 状态码,1表示成功,0表示失败,-1表示特殊错误
  • msg: 提示信息
  • data: 返回数据(部分接口有)

安全机制

安全机制说明

为了防止API被破解和滥用,系统实现了以下安全机制:

  • 请求签名验证:所有API请求必须包含HMAC-SHA256签名,防止请求被篡改和伪造
  • 时间戳验证:请求必须包含时间戳,服务端验证时间戳有效性(±5分钟),防止重放攻击
  • 随机数验证:请求必须包含随机数(nonce),服务端缓存已使用的nonce,防止重复请求
  • 卡密验证:所有需要卡密的接口都需要验证卡密的有效性
  • 卡密状态检查:每次请求都会检查卡密是否已激活、是否到期
  • 安全日志记录:记录所有安全相关事件,方便追踪异常行为
  • 速率限制:对登录接口实施IP维度速率限制,防止暴力破解
  • 高频封禁:高频无效请求将触发临时封禁
  • 白名单机制:白名单IP可以跳过所有安全验证,方便开发调试
  • 黑名单机制:黑名单IP将被直接拒绝访问,无法调用任何API
  • 版本强制校验:登录接口(卡密登录、试用登录)必须包含version参数,服务端校验版本是否低于最低要求,防止旧版软件绕过安全更新
签名机制说明

所有API请求必须包含以下安全参数:

  • timestamp:当前时间戳(秒),服务端会验证时间戳是否在有效范围内(±5分钟)
  • nonce:随机字符串(建议使用UUID或MD5),服务端会缓存已使用的nonce,防止重复请求
  • sign:HMAC-SHA256签名,使用软件的app_secret作为密钥

签名生成步骤:

  1. 将所有请求参数(除sign外)按参数名升序排序
  2. 将排序后的参数拼接成查询字符串(如:card_no=xxx&device_id=xxx&nonce=xxx&software_id=xxx&timestamp=xxx&version=xxx)
  3. 使用HMAC-SHA256算法,以app_secret为密钥,对拼接字符串进行签名
  4. 将签名结果作为sign参数的值

示例代码(PHP):

function generateSign($params, $secret) {
    unset($params['sign']);
    ksort($params);
    $string = http_build_query($params);
    return hash_hmac('sha256', $string, $secret);
}

$params = [
    'card_no' => 'FTPM-O0DX-5IN8-AZKR',
    'nonce' => md5(uniqid(mt_rand(), true)),
    'software_id' => 2,
    'timestamp' => time(),
    'version' => '1.0.0' // 登录接口必须包含 version
];

$secret = 'test_secret_key_123456';
$sign = generateSign($params, $secret);
$params['sign'] = $sign;

// 发送请求
$json = json_encode($params);
// ... 使用curl等工具发送请求
卡密使用说明
  • 激活卡密:通过卡密登录接口激活卡密,卡密状态变为已使用
  • 卡密有效期:卡密激活后开始计算有效期,到期后无法继续使用
  • 卡密使用:所有需要卡密的接口都需要携带card_no和software_id参数
  • 卡密唯一性:每张卡密只能使用一次,使用后无法重复使用
安全传输要求
  • 强制HTTPS:所有API请求必须使用HTTPS协议,禁止使用HTTP
  • 请求方式:所有接口仅支持POST请求,参数通过JSON格式放在请求体中
  • 禁止GET请求:卡密信息严禁出现在URL中,避免被服务器日志记录
  • 卡密保护:客户端应妥善保管卡密,避免在日志、错误信息中泄露
设备标识说明
  • device_id用途:用于软件启用设备绑定功能时,限制卡密只能在指定设备上使用
  • 生成规范:建议基于硬件指纹(如MAC地址、CPU序列号等)生成唯一标识
  • 服务端校验:服务端会校验device_id的格式和长度,防止伪造
  • 绑定限制:同一卡密只能绑定一个device_id,更换设备需重新激活
白名单黑名单说明

系统支持IP白名单和黑名单功能,用于精细化的访问控制:

白名单功能

  • 跳过安全验证:白名单IP可以跳过签名、时间戳、随机数和速率限制验证
  • 开发调试:方便开发人员在不实现完整签名机制的情况下测试API
  • 内部系统:内部服务器可以直接访问API,无需复杂的签名流程
  • 设备绑定:白名单规则支持按设备ID进行更精细的控制

黑名单功能

  • 拒绝访问:黑名单IP将被直接拒绝访问,无法调用任何API
  • 封禁恶意用户:将恶意IP加入黑名单,防止攻击
  • 设备绑定:黑名单规则也支持按设备ID进行更精细的控制

验证优先级

  1. 首先检查黑名单,如果IP在黑名单中,直接拒绝访问
  2. 然后检查白名单,如果IP在白名单中,跳过所有安全验证
  3. 如果IP既不在白名单也不在黑名单,执行所有安全验证

白名单请求示例

白名单IP可以简化请求参数,无需签名、时间戳和随机数:

{
    "software_id": 2,
    "card_no": "TEST-1234567890",
    "device_id": "DEVICE_001"
}

注意:白名单功能需要在后台管理系统中配置,由管理员添加IP地址到白名单。

版本强制更新机制

什么是版本强制更新?

版本强制更新是一项重要的安全机制,通过在后台设置最低允许版本,强制要求客户端必须升级到指定版本才能继续使用软件,防止旧版本软件绕过安全更新。

工作原理

1. 后台配置

管理员在后台的"软件管理"中可以设置:

  • 最低允许版本(min_version):如 1.0.0,低于此版本的客户端将被拒绝
  • 最新版本(latest_version):如 2.5.0,用于提示用户最新版本号
  • 下载地址(download_url):新版本的下载链接

2. 客户端请求

客户端在调用登录接口(卡密登录、试用登录)时,必须在请求参数中包含 version 字段:

{
    "software_id": 1,
    "version": "1.2.0",  // 客户端当前版本号
    "card_no": "XXXX-XXXX-XXXX-XXXX",
    "timestamp": 1737494400,
    "nonce": "random_string",
    "sign": "hmac_sha256_signature"
}

3. 服务端校验

服务端会自动比较客户端版本号与最低允许版本:

  • 如果 客户端版本 >= 最低允许版本:正常处理请求
  • 如果 客户端版本 < 最低允许版本:返回强制更新响应(code=100)
强制更新响应格式

当客户端版本过低时,登录接口(卡密登录、试用登录)会返回以下响应:

{
    "code": 100,  // 特殊状态码,表示强制更新
    "msg": "当前版本过低,请更新后使用",
    "data": {
        "min_version": "2.0.0",      // 最低允许版本
        "latest_version": "2.5.0",   // 最新版本
        "download_url": "https://example.com/download/v2.5.0"  // 下载地址
    }
}

客户端处理建议:

  • 检测到 code == 100 时,立即弹窗提示用户版本过低
  • 禁止用户继续使用软件,直到完成更新
  • 提供"立即更新"按钮,点击后打开 download_url
  • 显示最新版本号,提示用户当前版本与最新版本的差距
版本号格式说明

版本号必须遵循语义化版本(Semantic Versioning)规范:

标准格式:主版本号.次版本号.修订号

  • 主版本号(Major):重大功能变更或不兼容的API修改,如 1.x.x2.x.x
  • 次版本号(Minor):新增功能,但向后兼容,如 2.0.x2.1.x
  • 修订号(Patch):bug修复,如 2.1.02.1.1

示例:

1.0.0  // 初始版本
1.0.1  // 修复了一些bug
1.1.0  // 新增了部分功能
2.0.0  // 重大升级,可能不兼容旧版

版本比较规则:

  • 2.5.0 > 2.0.0
  • 2.0.1 > 2.0.0
  • 10.0.0 > 9.9.9(数值比较,不是字符串比较)
客户端处理建议

当客户端检测到API返回的 code == 100 时,应该:

  • 立即弹窗提示:告知用户当前版本过低,需要更新
  • 禁止继续使用:直到完成更新后才能使用软件
  • 提供更新按钮:点击后打开 data.download_url 下载页面
  • 显示版本信息:展示最低要求版本和最新版本号
  • 强制退出:如果用户拒绝更新,应退出程序

响应结构示例:

{
    "code": 100,
    "msg": "当前版本过低,请更新后使用",
    "data": {
        "min_version": "2.0.0",
        "latest_version": "2.5.0",
        "download_url": "https://example.com/download/v2.5.0"
    }
}
安全建议
  • 强制执行:客户端必须严格处理 code=100 的情况,不能让用户绕过更新继续使用
  • 只在登录时检查:系统只在登录接口(卡密登录、试用登录)进行版本检查,其他接口无需携带version参数
  • 渐进式更新:建议先设置一个缓冲期,给用户足够时间更新,避免突然强制导致用户流失
  • 测试验证:在生产环境修改最低版本前,务必在测试环境充分测试
  • 回滚准备:保留回滚能力,如果新版本有问题,可以快速降低最低版本要求
应用场景
  • 安全漏洞修复:发现严重安全漏洞时,强制所有用户更新到安全版本
  • API接口变更:当API接口发生不兼容变更时,要求客户端升级
  • 功能废弃:当某些旧功能被废弃时,要求用户升级到新版本
  • 协议升级:当通信协议或加密算法升级时,强制客户端同步升级
  • 合规要求:满足法律法规要求,确保所有用户使用合规版本

远程变量接口

接口说明

远程变量接口用于获取软件配置、权限设置等动态数据。支持获取单个变量、批量获取所有变量以及获取公开变量。

1. 获取指定变量 需要验证 高级安全

⚠️ 重要安全说明: 收费模式:需要完整的卡密验证,必须提供有效的卡密号、设备标识和签名。 免费模式:无需卡密,提供签名即可访问。
接口地址 /api/remote_var/getVar
请求方式 POST
请求格式 application/x-www-form-urlencoded 或 JSON
安全级别 🔒 高级安全(与登录验证一致)

请求参数:

参数名 类型 必填 说明
software_id int 软件ID
card_no string 条件 卡密号(收费模式必填,免费模式可省略)
device_id string 设备标识
var_id int 变量ID(远程变量的唯一标识)
timestamp int 时间戳(Unix时间戳)
nonce string 随机数(唯一标识)
sign string HMAC-SHA256签名

安全验证流程:

  • ✅ 验证签名是否正确
  • ✅ 验证时间戳是否在有效范围内
  • ✅ 验证nonce是否唯一
  • ✅ 验证卡密是否存在且有效
  • ✅ 验证卡密是否已激活
  • ✅ 验证卡密是否被封禁、冻结或禁用
  • ✅ 验证卡密是否过期
  • ✅ 验证设备绑定(如果软件要求)
  • ✅ 记录所有验证失败的安全事件

签名生成步骤:

  1. 将所有请求参数(除sign外)按参数名升序排序
  2. 将排序后的参数拼接成查询字符串(如:card_no=xxx&device_id=xxx&nonce=xxx&software_id=xxx&timestamp=xxx&var_id=xxx)
  3. 使用HMAC-SHA256算法,以app_secret为密钥,对拼接字符串进行签名
  4. 将签名结果作为sign参数的值

示例代码(PHP):

function generateSign($params, $secret) {
    unset($params['sign']);
    ksort($params);
    $string = http_build_query($params);
    return hash_hmac('sha256', $string, $secret);
}

$params = [
    'software_id' => 6,
    'card_no' => 'MSG4-BIRF-T9LZ-W107',
    'device_id' => 'DEV_BFCBFBFF000B06F2',
    'var_id' => 6,  // 注意:var_id必须是整数类型
    'timestamp' => time(),
    'nonce' => md5(uniqid(mt_rand(), true))
];

$secret = 'your_app_secret_here';  // 替换为实际的app_secret
$sign = generateSign($params, $secret);
$params['sign'] = $sign;

// 发送请求
// ... 使用curl等工具发送请求

请求示例:

curl -X POST https://yourdomain.com/api/remote_var/getVar \
  -d "software_id=2" \
  -d "card_no=B65C-C06B-E48F-A457" \
  -d "device_id=test_device_123" \
  -d "var_id=1" \
  -d "timestamp=1648741200" \
  -d "nonce=abc123" \
  -d "sign=计算出的签名"

成功响应:

{
    "code": 1,
    "msg": "ok",
    "data": {
        "var_id": 1,
        "var_key": "max_users",
        "var_value": "100"
    }
}

失败响应:

{
    "code": 0,
    "msg": "变量不存在"
}

2. 获取所有变量 需要验证 高级安全

⚠️ 重要安全说明: 收费模式:需要完整的卡密验证,必须提供有效的卡密号、设备标识和签名。 免费模式:无需卡密,提供签名即可访问。
接口地址 /api/remote_var/getAllVars
请求方式 POST
请求格式 application/x-www-form-urlencoded 或 JSON
安全级别 🔒 高级安全(与登录验证一致)

请求参数:

参数名 类型 必填 说明
software_id int 软件ID
card_no string 条件 卡密号(收费模式必填,免费模式可省略)
device_id string 设备标识
timestamp int 时间戳(Unix时间戳)
nonce string 随机数(唯一标识)
sign string HMAC-SHA256签名

请求示例:

POST https://yourdomain.com/api/remote_var/getAllVars
Content-Type: application/json

{
    "software_id": 2,
    "timestamp": 1648741200,
    "nonce": "abc123",
    "sign": "计算出的签名"
}

成功响应:

{
    "code": 1,
    "msg": "ok",
    "data": {
        "is_free": false,
        "vars": [
            {
                "id": 1,
                "var_key": "max_users",
                "var_value": "100"
            },
            {
                "id": 2,
                "var_key": "expiry_date",
                "var_value": "2024-12-31"
            }
        ]
    }
}
说明
  • 返回所有变量:此接口返回该软件的所有变量
  • 安全性:收费模式需要完整的卡密验证,免费模式无需卡密

3. 获取公开变量 公开接口

接口地址 /api/remote_var/getPublicVars
请求方式 POST
请求格式 application/x-www-form-urlencoded 或 JSON
传输协议 必须使用HTTPS
请求参数
参数名 类型 必填 说明
software_id int 软件项目ID,不传或传0表示获取全局公开变量
请求示例
POST /api/remote_var/getPublicVars HTTP/1.1
Host: yanzheng.6vps.net
Content-Type: application/json

{
    "software_id": 1
}
返回示例
{
    "code": 1,
    "msg": "ok",
    "data": [
        {
            "var_key": "version",
            "var_value": "1.0.0"
        },
        {
            "var_key": "max_users",
            "var_value": "100"
        }
    ]
}
错误码 1 成功
0 非法请求 / 系统错误
公开变量说明
  • 无需验证:此接口为公开接口,无需卡密验证,只需提供software_id
  • 全局变量:不传software_id或传0时,获取全局公开变量
  • 软件变量:传递software_id时,只获取该软件的公开变量
  • 安全性:公开变量可以公开访问,但建议不要存储敏感信息

公告接口

1. 获取公告列表 公开接口

接口地址 /api/announcement/getList
请求方式 POST
请求格式 JSON(Content-Type: application/json)
传输协议 必须使用HTTPS
请求参数
参数名 类型 必填 说明
software_id int 软件项目ID,不传或传0表示获取全局公告
请求示例
POST /api/announcement/getList HTTP/1.1
Host: yanzheng.6vps.net
Content-Type: application/json

{
    "software_id": 1
}
返回示例
{
    "code": 1,
    "msg": "获取成功",
    "data": [
        {
            "id": 1,
            "title": "系统维护通知",
            "content": "系统将于今晚进行维护,请提前做好准备",
            "type": 1,
            "type_text": "重要",
            "create_time": "2026-01-15 12:00:00"
        },
        {
            "id": 2,
            "title": "新功能上线",
            "content": "新增试用功能,欢迎体验",
            "type": 0,
            "type_text": "普通",
            "create_time": "2026-01-15 10:00:00"
        }
    ]
}
错误码 1 成功
0 非法请求 / 系统错误
公告说明
  • 全局公告:不传software_id或传0时,获取全局公告,所有软件都能看到
  • 软件公告:传递software_id时,只获取该软件的公告
  • 公告类型:返回的type字段表示公告类型(0=普通,1=重要,2=紧急)
  • 排序规则:公告按sort降序、ID降序返回,sort越大越靠前
  • 状态过滤:只返回启用状态的公告
注意事项
  • 无需签名:此接口不需要签名验证,可以直接调用
  • 缓存建议:建议客户端缓存公告数据,避免频繁请求
  • 更新频率:建议每次启动软件时调用一次,或每隔一段时间调用一次
  • 显示建议:建议根据type字段使用不同颜色或图标显示公告

用户接口

1. 卡密登录 无需登录

接口地址 /api/user/loginByCard
请求方式 POST
请求格式 JSON(Content-Type: application/json)
传输协议 必须使用HTTPS
请求参数
参数名 类型 必填 说明
card_no string 卡密号
device_id string 设备标识(如果软件启用了设备绑定则为必填)
nonce string 随机字符串(防止重放攻击)
software_id int 软件项目ID
timestamp int 当前时间戳(秒)
version string 客户端当前版本号
sign string HMAC-SHA256签名
请求示例
POST /api/user/loginByCard HTTP/1.1
Host: yanzheng.6vps.net
Content-Type: application/json

{
    "card_no": "ABCD-EFGH-IJKL-MNOP",
    "device_id": "DEVICE_001",
    "nonce": "a1b2c3d4e5f6",
    "software_id": 1,
    "timestamp": 1737494400,
    "version": "1.0.0",
    "sign": "hmac_sha256_signature_here"
}
返回示例
{
    "code": 1,
    "msg": "登录成功",
    "data": {
        "card_no": "ABCD-EFGH-IJKL-MNOP",
        "expire_time": 1737494400,
        "expire_time_text": "2025-01-22 12:00:00"
    }
}
错误码 1 成功
100 版本过低,强制更新
0 参数错误 / 软件不存在或已禁用 / 卡密不存在或已被使用 / 系统错误
说明
  • 使用卡密登录会激活卡密,卡密状态变为已使用
  • 卡密只能使用一次,使用后自动标记为已使用
  • 登录成功后会返回到期时间信息
  • 如果软件启用了设备绑定,则必须传递device_id

3. 试用登录 需设备标识

接口地址 /api/user/trial
请求方式 POST
请求格式 JSON(Content-Type: application/json)
传输协议 必须使用HTTPS
请求参数
参数名 类型 必填 说明
device_id string 设备标识(如果软件启用了设备绑定则为必填)
nonce string 随机字符串(防止重放攻击)
software_id int 软件项目ID
timestamp int 当前时间戳(秒)
version string 客户端当前版本号
sign string HMAC-SHA256签名
请求示例
POST /api/user/trial HTTP/1.1
Host: yanzheng.6vps.net
Content-Type: application/json

{
    "device_id": "DEVICE_001",
    "nonce": "a1b2c3d4e5f6",
    "software_id": 1,
    "timestamp": 1737494400,
    "version": "1.0.0",
    "sign": "hmac_sha256_signature_here"
}
返回示例
{
    "code": 1,
    "msg": "试用成功",
    "data": {
        "software_id": 1,
        "expire_time": 1737495200,
        "expire_time_text": "2025-01-22 12:13:20",
        "trial_minutes": 10,
        "trial_notice": "试用已到期,请购买正式版"
    }
}
错误码 1 成功
100 版本过低,强制更新
0 参数错误 / 软件不存在或已禁用 / 该软件不提供试用 / 请传递设备标识 / 该设备已试用过 / 系统错误
试用说明
  • 试用时长:试用时长由软件的trial_minutes配置决定,单位为分钟
  • 试用限制:如果软件启用了试用限制(trial_limit=1),则每个设备只能试用一次
  • 试用缓存:试用信息会缓存在服务端,试用期内重复调用会返回相同的试用信息
  • 试用到期:试用到期后需要购买正式版卡密才能继续使用
  • 设备绑定:如果软件启用了设备绑定,则必须传递device_id参数
  • 试用提示:返回的trial_notice字段可用于在软件中显示试用到期提示
注意事项
  • 试用次数限制:试用次数由软件的trial_limit配置决定,0表示不限制,1表示限制一次
  • 试用时间计算:试用时间从第一次调用试用接口开始计算,到期后无法再次试用
  • 设备标识:device_id用于区分不同设备,建议使用硬件指纹生成唯一标识
  • 缓存过期:试用信息缓存时间与试用时长相同,到期后自动清除

5. 自主解绑设备 需扣除时长

接口地址 /api/user/unbindDevice
请求方式 POST
请求参数
参数名 类型 必填 说明
card_no string 卡密号
device_id string 当前绑定的设备标识
nonce string 随机字符串
software_id int 软件项目ID
timestamp int 当前时间戳
sign string 签名
返回示例
{
    "code": 1,
    "msg": "解绑成功,本次扣除时长 10080 分钟",
    "data": {
        "reset_count": 1,
        "reset_limit": 3,
        "expire_time": 1740489120,
        "expire_time_text": "2026-02-24 21:12:00"
    }
}
功能说明
  • 自助解绑:允许用户在更换电脑后,通过接口自主解除旧设备的绑定。
  • 扣费机制:根据后台设置,每次解绑会扣除相应的天数或分钟数作为手续费。
  • 次数限制:后台可限制每个卡密每月最多解绑的次数。
  • 类型限制:后台可以在卡密类型中设置是否允许自助解绑,部分类型可能不允许使用此功能。

4. 卡密心跳 安全

接口地址 /api/user/heartbeat
请求方式 POST
请求格式 JSON(Content-Type: application/json)
传输协议 必须使用HTTPS
请求参数
参数名 类型 必填 说明
card_no string 卡密号
device_id string 设备标识
nonce string 随机字符串
software_id int 软件项目ID
timestamp int 当前时间戳(秒)
sign string 签名
请求示例
POST /api/user/heartbeat HTTP/1.1
Host: yanzheng.6vps.net
Content-Type: application/json

{
    "card_no": "ABCD-EFGH-IJKL-MNOP",
    "device_id": "DEVICE_001",
    "nonce": "a1b2c3d4e5f6",
    "software_id": 1,
    "timestamp": 1737494400,
    "sign": "hmac_sha256_signature_here"
}
返回示例
{
    "code": 1,
    "msg": "ok",
    "data": {
        "card_no": "ABCD-EFGH-IJKL-MNOP",
        "expire_time": 1737494400,
        "expire_time_text": "2025-01-22 12:00:00"
    }
}
错误码 1 成功
0 参数错误 / 卡密不存在或未激活 / 卡密已到期 / 系统错误
安全作用

防止卡密滥用和破解:心跳接口是系统安全机制的重要组成部分,用于定期检查卡密是否合法

  • 验证卡密状态:每次心跳都会检查卡密是否已激活、是否到期
  • 防止破解:定期验证确保只有合法的卡密才能继续使用软件
  • 实时状态同步:返回最新的卡密状态信息(到期时间等)

调用建议:建议每隔30-60秒调用一次,确保及时发现卡密状态变化

错误码说明

错误码 说明
1 操作成功
0 参数错误 / 软件不存在或已禁用 / 卡密不存在或已被使用 / 卡密已到期 / 变量不存在 / 非法请求 / 系统错误
错误码使用说明
  • code = 1:表示请求成功,返回的数据在data字段中
  • code = 0:表示请求失败,msg字段会包含具体的错误信息

注意事项

重要提示
  • 所有需要卡密的接口都必须传递正确的card_no和software_id
  • 建议客户端实现自动重试机制,处理网络异常情况
  • 心跳接口应该定期调用,建议间隔30-60秒
  • 卡密只能使用一次,使用后自动标记为已使用,无法重复使用
  • 卡密登录后会激活卡密,卡密状态变为已使用
开发建议
  • 必须使用HTTPS:所有API请求必须使用HTTPS协议,确保数据传输安全
  • 卡密存储:建议在客户端安全存储卡密(如使用加密存储),避免明文保存
  • 心跳超时检测:如果心跳失败超过一定次数,应该提示用户重新输入卡密
  • 日志安全:记录API调用日志时,避免记录完整的卡密信息
  • 输入验证:在客户端实现卡密格式验证,避免无效请求
  • 用户体验:建议在客户端显示卡密到期时间信息
  • 错误处理:妥善处理网络错误和API错误,避免泄露敏感信息
接口调用流程
  1. 卡密登录:使用卡密号和软件ID调用登录接口(必须HTTPS)
  2. 获取信息:登录成功后会返回到期时间信息
  3. 心跳检测:定期调用心跳接口,验证卡密状态(建议30-60秒)
  4. 获取变量:根据需要调用远程变量接口获取配置
  5. 错误处理:如果返回code=0且提示卡密已到期,需要提示用户重新输入卡密
禁止事项
  • 禁止HTTP:严禁使用HTTP协议传输卡密信息
  • 禁止GET请求:严禁通过URL参数传递卡密
  • 禁止日志泄露:严禁在客户端日志、错误信息中记录完整卡密
  • 禁止暴力破解:严禁通过自动化工具批量尝试卡密
  • 禁止多设备共享:严禁将同一卡密在多个设备上同时使用
0.141618s