接口签名防重放攻击:请求被截获重复提交?Timestamp + Nonce + Signature 三重校验!
朋友前段时间接了个支付对接的项目,联调的时候一切正常,上线跑了两天也没事。直到有一天财务对账,发现有几笔订单被扣了两次款。排查了半天,日志里同一笔订单收到了两条完全一样的请求,时间间隔不到一秒。他当时就懵了 —— 代码里明明做了幂等,怎么还能重复扣款? 这不是什么高深的 0day 漏洞,甚至连"攻击"都算不上。就是一个中间人把你发出去的请求原封不动复制了一份,重新扔给了服务器。但后果你能想象:重复扣款、重复下单、重复发券,随便哪个都能让业务方提着刀来找你。 这个问题学名叫重放攻击(Replay Attack),解决起来其实思路很清晰。今天就用大白话聊聊,怎么用三道防线把这种请求挡在外面。 先说说重放攻击到底是怎么回事 举个例子。你在 App 上下一笔订单,客户端会发一个 HTTP 请求到服务器: POST /api/order/create Body: {"productId": 123, "amount": 99.00, "userId": 456} 这个请求跑在 HTTPS 下面,内容是加密的,中间人看不到你买了啥。但他不需要看到内容 —— 他把整个加密的数据包原封不动抓下来....