有效的测试防重放机制主流技术包括以下四种:
1. 时间戳与超时验证
客户端发起请求时,加入当前时间戳(如Unix timestamp)作为参数。服务器收到请求后,计算当前时间与时间戳的差值。若差值超过预设阈值(通常为1-5分钟),则判定请求超时,拒绝执行。此方法要求服务器与客户端时间保持基本同步,可有效拦截长时间后的重放请求。
2. 随机数一次有效
服务器为每个会话或事务生成一个唯一随机数(Nonce),下发给客户端。客户端在发起敏感操作请求时携带此随机数。服务器维护一个已使用随机数的缓存池,检查接收到随机数是否有效且未被使用过。验证通过后,立即将该随机数标记为已失效,后续所有携带相同随机数的请求均被拒绝。
3. 序列号递增验证
为每个客户端或会话分配一个初始序列号,每次请求序列号递增。服务器记录最后有效的序列号,拒绝接收序列号不大于已记录值的请求。此方法需解决请求乱序到达问题,通常用于TCP协议或有序通信场景。
4. 数字签名验证
使用HMAC(基于哈希的消息认证码)对请求关键参数(如订单ID、金额、时间戳)生成数字签名。客户端将签名随请求一同发送。服务器收到后使用相同密钥和算法重新计算签名,比对一致性。任何对参数的篡改或重放均会导致签名验证失败。签名密钥应安全存储于服务端,避免泄露。
测试防重放机制有效性的主要测试步骤包括:
1. 重放合法请求捕获
使用Burp Suite、OWASP ZAP等代理工具拦截正常业务流程中的敏感操作请求(如支付确认POST请求)。完整保存该请求的URL、Headers、Body等所有内容。
2. 重放测试
不修改任何参数,立即将捕获的请求重放发送数次。系统应拒绝第二次及之后的请求,并返回明确的错误信息(如“重复请求”)、状态码(如409 Conflict)或执行失败。若多次重放均成功,则存在高危漏洞。
3. 时间戳篡改测试
若请求使用时间戳机制,修改时间戳参数为未来或过去时间后重放。系统应拒绝严重偏离服务器时间的请求。
4. 随机数重用测试
若请求使用随机数,尝试重复使用已成功过一次的随机数参数发起新请求。系统应能识别并拒绝该重复随机数。
5. 签名破解测试
若请求使用数字签名,在修改任何业务参数(如支付金额从100元改为1元)后重放请求。系统签名验证应失败。尝试暴力破解或分析签名算法漏洞。