nginx层拦截恶意请求是最轻量高效的核心接口防护手段;通过limit_req_zone限流、白名单ip/referer控制、敏感路径deny、安全响应头注入及危险参数/ua过滤,实现前置哨卡式防护。

直接在 Nginx 层拦截恶意请求、限制访问行为、隔离敏感路径,是保护核心业务接口最轻量又最有效的手段。它不依赖后端代码改动,响应快、开销低,相当于给关键接口加了一道“前置哨卡”。
限制请求频率与并发数
高频调用可能是爬虫、暴力探测或误配置的定时任务,放任不管容易拖垮后端服务。
- 在 http 块中定义限流区域:
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;
按客户端 IP 统计,每秒最多 5 次请求,超出则排队或拒绝 - 在 location 块中启用限流:
location /api/v1/order/ {<br> limit_req zone=api_limit burst=10 nodelay;<br>}
burst=10 允许短时突发,nodelay 表示不排队,超限直接返回 503 - 如需更细粒度控制(如按用户 token),可结合 $arg_token 或 $http_authorization 提取参数做哈希限流
只允许可信来源与方法
核心接口通常不需要全网开放,也不该接受任意 HTTP 方法。
- 严格限定请求方式:
if ($request_method !~ ^(GET|POST|PUT|DELETE)$) {<br> return 405;<br>}
非标准方法(如 OPTIONS、TRACE)一律拒绝 - 白名单 IP 或 Referer 控制:
allow 192.168.10.0/24;<br>allow 2001:db8::/32;<br>deny all;
或针对特定接口校验 Referer:valid_referers ~\.yourdomain\.com$;<br>if ($invalid_referer) { return 403; }
隐藏路径与强化访问控制
避免暴露接口真实结构,同时防止未授权访问。
- 禁止直接访问敏感路径:
location ~ ^/(admin|debug|healthz|metrics) {<br> deny all;<br>}
或仅允许内网访问:location /healthz {<br> allow 127.0.0.1;<br> allow 10.0.0.0/8;<br> deny all;<br>} - 使用内部重写隐藏真实路由:
location /svc/order-submit {<br> proxy_pass http://backend/order/v2/submit;<br> proxy_set_header X-Real-IP $remote_addr;<br>}
对外路径与后端路径解耦,降低被枚举风险
添加安全响应头与请求过滤
从浏览器和中间链路层面加固,防常见 Web 攻击。
- 对核心接口统一注入安全头:
add_header X-Content-Type-Options "nosniff" always;<br>add_header X-Frame-Options "DENY" always;<br>add_header Content-Security-Policy "default-src 'self';" always;
- 拦截危险请求特征:
if ($args ~ "(?:%3C|%3E||javascript:|eval\()") { return 400; }<br>if ($http_user_agent ~* (sqlmap|nikto|wget|curl)) { return 403; }
注意:正则匹配需谨慎,避免误杀;生产环境建议配合 geoip 或 real-ip 使用











