第三方登记软件测试报告:Postman验证API防篡改能力

Postman 的优势在于其强大的脚本(Pre-request Script 和 Tests Script)和集合运行器(Collection Runner),能够自动化、系统化地模拟各种篡改情况。

主要API防篡改验证包括:
1.签名验证机制: API 服务器使用预定义的算法(如 HMAC-SHA256)为请求生成数字签名。任何对参数、Body 或头的修改都会导致签名失效。
2.参数完整性校验: 服务器会检查关键参数是否被篡改,特别是那些影响业务逻辑的参数(如 userId, amount, price)。
3.防重放攻击机制: 通过时间戳(Timestamp)、随机数(Nonce)或序列号确保同一请求不能被重复提交。
4.时效性验证: 请求是否在有效时间窗口内,防止过时请求被恶意重放。

Postman 的脚本能力可以精准地针对上述每一点进行自动化测试。

专业测试流程:

创建 Collection 和环境变量
新建一个 Collection,命名为 API Tamper Resistance Tests。

创建环境变量,用于集中管理配置:

api_base_url: https://api.yourdomain.com

api_key: your_api_key

secret_key: your_secret_key (用于签名计算,切勿硬编码在脚本中,最好通过变量在运行时注入)

auth_token: (用于存储登录后获得的令牌)

假设我们有一个转账 API:POST /api/v1/transfer

请求体 (JSON):

bash 复制代码
json
{
  "fromAccount": "user123",
  "toAccount": "user456",
  "amount": 100.00,
  "currency": "USD",
  "timestamp": 1627891234,
  "nonce": "abc123def"
}

正常请求(基准测试)

在 Collection 的 Pre-request Script 选项卡中,编写通用签名函数。这样每个请求在执行前都会自动计算签名。

javascript 复制代码
// Collection-Level Pre-request Script: 通用签名函数
function generateSignature(secret, method, path, body, timestamp, nonce) {
    // 1. 构建待签名的字符串:方法、路径、排序后的参数、时间戳、随机数等
    const stringToSign = `${method}\n${path}\n${JSON.stringify(body)}\n${timestamp}\n${nonce}`;
    
    // 2. 使用 CryptoJS 库进行 HMAC-SHA256 签名
    const signature = CryptoJS.HmacSHA256(stringToSign, secret).toString(CryptoJS.enc.Hex);
    return signature;
}

// 获取当前时间戳和生成随机数
const timestamp = Math.floor(Date.now() / 1000);
const nonce = CryptoJS.lib.WordArray.random(16).toString(); // 生成16字节随机数

// 将变量设置到集合级别,供请求使用
pm.collectionVariables.set("timestamp", timestamp);
pm.collectionVariables.set("nonce", nonce);

// 计算当前请求的签名
const secretKey = pm.collectionVariables.get("secret_key");
const requestMethod = pm.request.method;
const requestPath = pm.request.url.getPath(); // 获取 URL 路径,如 /api/v1/transfer
const requestBody = pm.request.body.raw ? JSON.parse(pm.request.body.raw) : {};

const calculatedSignature = generateSignature(secretKey, requestMethod, requestPath, requestBody, timestamp, nonce);
pm.collectionVariables.set("request_signature", calculatedSignature);

在请求的 Headers 中,引用计算出的签名、时间戳和随机数:

bash 复制代码
// 验证正常请求是否成功
pm.test("Normal request should be successful", function () {
    pm.response.to.have.status(200);
    pm.expect(pm.response.json().code).to.eql(0);
});

现在,我们复制上面的正常请求,创建多个副本,每个副本针对一种篡改场景。

使用错误的签名。

Postman 实现:

复制请求,重命名为 [Tamper] Invalid Signature。

在其 Pre-request Script 中,覆盖签名值为一个错误值。

javascript 复制代码
// 覆盖正确的签名为一个明显错误的签名
pm.collectionVariables.set("request_signature", "invalid_malicious_signature_here");

API 应返回 401 Unauthorized 或 403 Forbidden。在 Tests 中验证:

javascript 复制代码
pm.test("Tampered signature should be rejected", function () {
    pm.response.to.have.status(401); // 或 403
});

修改业务参数

攻击方式: 修改请求体中的 amount(金额)或 toAccount(收款人)。

Postman 实现:

1.复制请求,重命名为 [Tamper] Modified Amount。

2.在 Body 选项卡中,将 "amount": 100.00 改为 "amount": 10000.00。

保持 Pre-request Script 不变。这样,请求体被修改了,但签名还是用原始参数计算的。服务器用收到的参数重新计算签名,会发现与请求头中的签名不匹配。

结果: 401/403 错误。

测试防重放攻击 - 重复使用 Nonce

重复发送完全相同的请求(包括相同的 Nonce 和 Timestamp)

Postman 实现:

复制请求,重命名为 [Tamper] Replay Attack。

在其 Pre-request Script 中,手动设置一个已经使用过的 nonce 和 timestamp。

javascript 复制代码
// 使用一个固定的、已经用过的 nonce 和 timestamp
pm.collectionVariables.set("nonce", "previously_used_nonce_value");
pm.collectionVariables.set("timestamp", 1627891000); // 一个旧的 timestamp
// 注意:签名需要基于这些旧值重新计算,脚本会自动处理

结果:API 应返回 400 Bad Request 或 409 Conflict,并提示 "Nonce already used" 或 "Request expired"。

测试时效性验证 - 使用过期时间戳

发送一个时间戳远远超出服务器允许时间窗口(如 ±5 分钟)的请求。

Postman 实现:

复制请求,重命名为 [Tamper] Expired Timestamp。

在其 Pre-request Script 中,将时间戳设置为一天前。

javascript 复制代码
const oneDayAgo = Math.floor(Date.now() / 1000) - (24 * 60 * 60);
pm.collectionVariables.set("timestamp", oneDayAgo);

结果: 400 Bad Request, "Request timestamp expired".

相关推荐
小年糕是糕手5 小时前
【C语言】C语言预处理详解,从基础到进阶的全面讲解
linux·c语言·开发语言·数据结构·c++·windows·microsoft
武子康5 小时前
Java-131 深入浅出 MySQL MyCat 深入解析 schema.xml 配置详解:逻辑库、逻辑表、数据节点全攻略
xml·java·数据库·mysql·性能优化·系统架构·mycat
高山有多高6 小时前
从 0 到 1 保姆级实现C语言双向链表
c语言·开发语言·数据结构·c++·算法·visual studio
Lucis__6 小时前
C++相关概念与语法基础——C基础上的改进与优化
c语言·开发语言·c++
草莓熊Lotso6 小时前
《算法闯关指南:优选算法--滑动窗口》--14找到字符串中所有字母异位词
java·linux·开发语言·c++·算法·java-ee
MATLAB代码顾问7 小时前
Python实现手榴弹爆炸算法(Grenade Explosion Method, GEM)(附完整代码)
开发语言·python·算法
人工干智能7 小时前
Python的大杀器:Jupyter Notebook处理.ipynb文件
开发语言·python·jupyter
zpf_叶绿体学编程7 小时前
一命速通:Go 语言操作 Office Excel 文档,从入门到实战解析
开发语言·golang·excel
涤生大数据7 小时前
Apache Doris性能优化全解析:慢查询定位与引擎深度调优
性能优化·apache·doris·大数据技术