抓到的请求改参数重发,请求重放与签名接口实操

25 阅读4分钟

前阵子调一个带签名的接口,抓下来一条能通的请求,想改个参数重发试试服务端校验——原样贴到别的工具里发出去,返回"签名错误"。请求头里的 X-Timestamp 和 X-Sign 写的是抓包那一刻的值,早过期了,照抄的请求当然通不过。

"抓到的请求改参数重发"这类需求,抓包工具里的请求构造器就是干这个的。拿 TraceEagle 举例,最省事的入口是粘一条 cURL:

curl -X POST 'https://api.example.com/v1/order' \
  -H 'Content-Type: application/json' \
  -H 'X-Timestamp: 1718000000' \
  -H 'X-Sign: 8f3a...' \
  -d '{"sku":"A1","qty":2}'

导入后自动拆成可编辑的表单:方法、URL、请求头、请求体各归各位,不用手抄。下面把请求重放的几条用法拆开讲。

一、抓到的请求载进来 改几个参数再发

流量列表里右键某条请求(或详情面板点「编辑并重发」),它原样载入构造器:地址按抓包时的协议、主机、端口自动还原,请求体和类型按内容自动识别,无关的连接头自动剔除。什么都不改直接发,就是一键重发;改 URL、参数、请求头或 body 再发,就是验证服务端对不同入参的反应。每次发送都记进独立的 Composer 会话页签,保留完整历史,和抓到的请求一样可以再查看、再修改。

两种入口怎么选?手里已经有一条调得通的真实请求(想改参数复现、或换环境重试),走"编辑并重发",字段全带好了;手上只有接口文档、要从零试一个新接口,走手拼。日常排查里前者用得更多——抓下来改一改,比从头填一遍快得多。

Charles、Fiddler 也有类似的重发入口(Repeat、Compose),思路一致:不用手抄请求,从抓到的流量里带出来。

二、从零手拼一条 按区块填

手拼的请求就五块:方法加 URL;查询参数按表格一行一个,和 URL 分开维护——发送时才拼接,参数里写的动态占位符不会被提前编码破坏;请求头表格逐行增删改;鉴权助手(Bearer、Basic 自动 base64,只在你没手写 Authorization 头时生效);请求体(JSON、表单、原始文本,选前两种自动补 Content-Type)。填完点发送。

三、带签名的接口 让时间戳和签名现算

这是 TraceEagle 构造器里最值钱的地方。任意字段里都能写 ${...} 动态值,发送前在本地求值——签名接口常用的那几类都覆盖了:

写法值
${timestamp} / ${timestampMs}秒级 / 毫秒级时间戳
${hmacSha256:key,msg}HMAC 签名
${md5:...} / ${sha256:...}哈希
${randomUUID} / ${random}随机值
${base64:...} / ${urlEncode:...}编码转换

签名接口的典型配法:请求头放 X-Timestamp: ${timestamp},签名头放 X-Sign: ${hmacSha256:${secret},${timestamp}}——动态值可以嵌套,先取环境变量里的密钥,再拿去算签名。每次发送时间戳和签名跟着自动更新,返回的不再是"签名过期",而是正常业务响应。还有个细节:算不出来的动态值会原样保留在发送内容里,一眼能看出哪个变量拼错了,不会稀里糊涂发出个空值。 重发

四、环境与集合 请求和地址都管起来

地址里会变的部分抽成 ${name} 环境变量,开发、测试、线上几套配好,一键切换整套地址和参数,变量之间还能链式引用。常用请求存进集合分组,随时载回复用。集合加环境自动保存成一份纯文本文件——可以 diff、可以 review,团队共享和版本追溯都方便。

一个顺手的用法:要复现昨天线上失败的那条请求——把域名抽成 ${baseUrl},切到测试环境,请求参数一个不动,两次返回的差异一目了然。这类"同一条请求多环境复现"的活,比手工改地址逐条核对省事得多。

想让重放结果更可信,构造器设置里还能对齐网络特征:走上游代理(http / socks5)、把请求特征还原为标准客户端、指定自定义 DNS 解析。和抓包时的链路一致,排查结论才站得住。

五、发不通的四种情况

  • 返回"签名错误、时间戳过期"? 签名字段写的是抓包时的旧值,改成 ${timestamp}、${hmacSha256:...} 现算。
  • 某个 ${...} 原样出现在请求里? 变量没求到值——拼错了或环境里没定义,检查拼写和当前环境。
  • 请求体发出没带 Content-Type? 请求体选的是"无"或原始文本;选 JSON / 表单会自动补上,也可以在请求头里手写。
  • 鉴权没生效? 已经手写 Authorization 头时鉴权助手不工作,二选一,别重复。

发送结果怎么确认?构造器里内联显示状态码、协议和耗时,收到响应就说明这一发通了;这一发会作为一条 Flow 记进 Composer 会话,点开能看到完整请求和响应,存疑的可以和历史抓到的真实流量并排对比。

和规则改写那类"流量经过时自动改"的能力不同,构造器是主动造请求:你写什么,发什么。验证完的请求还能一键导出成 cURL、Python、Go 代码贴进项目,或与历史请求并排对比,定位签名和参数的差异。

重放的用法就一句话:把真实请求载进来,让会变的(时间戳、签名、环境)自己变,让不该变的保持原样——改参数、验签名、跑回归,一个构造器接住。