Nginx 下重放攻击需分层防护:普通HTTP用Nonce+时间戳+Redis校验;TLS 1.3 0-RTT须拦截非幂等方法并透传Early-Data;CSRF依赖后端一次性Token清除机制。

重放攻击防范在 Nginx 环境下不能靠单一手段,需分层应对:对普通 HTTP 请求,重点用 Nonce + 时间戳 + Redis 做一次性校验;对 TLS 1.3 的 0-RTT 流量,必须拦截非幂等方法并显式传递 Early-Data 标识;CSRF 类场景则依赖后端配合的一次性 Token 清除机制。Nginx 本身不生成凭证,只做前置拦截与透传标记。
普通接口的 Nonce 校验(推荐首选)
适用于自定义 API、登录、下单等敏感请求。客户端每次生成 UUID v4 作为 X-Request-Nonce,同时携带 X-Request-Timestamp(秒级时间戳)。
- Nginx 需运行 OpenResty,启用
ngx_lua模块 - 在
location块中使用access_by_lua_block提取头信息,并检查时间戳是否超时(如 >30 秒) - 调用 Redis 执行
SETEX nonce 300 "1"(5 分钟有效期),利用原子写入避免竞态;失败即返回403 - Redis Key 不拼接用户 ID 或业务字段,保持纯粹唯一性
TLS 1.3 0-RTT 请求的专项防护
0-RTT 天然可重放,Nginx 必须主动干预,不能依赖后端兜底。
- 用
limit_except GET HEAD直接拒绝 POST/PUT/DELETE 类 0-RTT 请求 - 通过
proxy_set_header Early-Data $ssl_early_data;将标识透传给后端 - 所有带写操作意图的路径(如
/api/v1/order)必须放在独立location块内,绑定上述限制 - 若业务强要求 0-RTT 写(极少见),需后端叠加三要素:一次性 token + ≤5 秒时间窗 + 请求指纹(body hash + IP + UA)
CSRF 场景下的 Token 协同防御
Nginx 不生成也不验证 CSRF Token,但可强化传输与初筛环节。
- 前端必须将 Token 放在 X-CSRF-Token 请求头中(不走 Cookie 或 URL 参数)
- Nginx 配置
proxy_set_header X-CSRF-Token $http_x_csrf_token;确保完整透传 - 添加基础校验:
if ($http_x_csrf_token = "") { return 403; } - 后端收到后需比对 session 中绑定的值,并立即销毁该 Token——这是防重放的关键一步
辅助加固项(降低攻击面)
这些配置不直接防重放,但能阻断常见绕过路径或提升整体健壮性。
- 关闭版本暴露:
server_tokens off;防止攻击者针对性利用已知漏洞 - 限制请求频率:
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;对高频重复请求形成压制 - 禁止非法方法:
if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|OPTIONS)$) { return 405; } - 过滤可疑 User-Agent 或 query_string(如含
base64_decode、union select)


















