php接口防重放采用时间戳+签名+nonce三重机制:校验时间戳是否在5分钟窗口内,用hmac-sha256对排序参数(含timestamp、nonce)和密钥生成签名并比对,同时缓存nonce防止短时重放。

PHP接口防重放的核心是时间戳加签名机制,关键在于请求的时效性与不可篡改性。服务端需校验时间戳是否在允许窗口内(如5分钟),并用约定密钥重新计算签名,比对客户端传来的签名是否一致。
时间戳校验:限制请求有效期
客户端在请求参数中携带当前毫秒级或秒级时间戳(如 timestamp=1718923456),服务端收到后立即检查:
• 是否为空或非法格式
• 与服务器当前时间差是否超过预设阈值(建议 ≤ 300 秒)
• 时间戳是否早于服务器当前时间(防止未来时间攻击)
若任一不满足,直接拒绝请求,返回 401 或自定义错误码。
签名生成与验证:确保参数完整性
签名应基于请求方法、URL路径、所有排序后的参数(含 timestamp、nonce)、密钥共同生成,推荐使用 HMAC-SHA256:
• 客户端按字母序对非空参数排序,拼接为 key1=value1&key2=value2… 形式
• 加入 timestamp 和随机字符串 nonce(防重复提交)
• 使用约定 secret_key 进行 hmac_hash_hmac('sha256', $data, $secret_key)
服务端执行完全相同的逻辑,比对结果是否与客户端传入的 sign 字段一致。
Nonce 随机数:辅助防御短时重放
在签名和校验中引入一次性随机字符串(nonce),如 UUID 或 16 位随机字符:
• 每次请求生成唯一 nonce,随参数一起发送
• 服务端将有效期内(如 5 分钟)使用过的 nonce 缓存(Redis 最佳)
• 若 nonce 已存在,说明是重放请求,直接拦截
注意:nonce 缓存需设置自动过期,避免内存堆积。
常见疏漏与加固建议
• 不要忽略 GET 与 POST 的参数统一处理——GET 参数和 POST body 中的 JSON 字段都应参与签名计算
• 签名过程必须排除 sign、signature 等签名自身字段,否则会导致循环依赖
• 时间戳单位需前后端严格一致(推荐全部用秒,避免毫秒带来的时区/精度误差)
• 密钥 secret_key 绝不能硬编码在前端或日志中,应由服务端安全配置管理
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











