Nginx屏蔽异常API调用需分层识别、精准拦截、留痕可溯:严格白名单校验Origin(禁用*)、limit_except收紧HTTP方法、拦截%00及高危UA、条件限制Referer,不替代后端鉴权但大幅削减非法流量。

屏蔽异常来源的 API 调用,关键不是“一刀切”封禁,而是分层识别、精准拦截、留痕可溯。Nginx 作为请求第一入口,应承担轻量但有效的过滤职责,不替代后端鉴权,但要大幅减少非法流量触达业务逻辑。
按 Origin 白名单严格校验跨域请求
开放 Access-Control-Allow-Origin: * 等同于放弃 CORS 安全控制,尤其当 API 涉及登录态或写操作时风险极高。必须用 map 模块实现动态白名单:
- 在
http{}块顶部定义可信域名映射:map $http_origin $cors_allowed {<br> default ""; # 默认不放行<br> "https://app.example.com" "https://app.example.com";<br> "https://admin.example.net" "https://admin.example.net";<br>} - 在 API location 中条件添加响应头:
if ($cors_allowed) {<br> add_header Access-Control-Allow-Origin $cors_allowed;<br> add_header Access-Control-Allow-Credentials true;<br>} - 对不匹配的 Origin 请求,直接返回
403或静默丢弃(避免暴露校验逻辑)
拦截非法 HTTP 方法与畸形动词
正常前端极少使用 TRACE、TRACK、CONNECT 或自定义二进制方法(如 \x12\x01)。这些几乎全是扫描或攻击试探:
- 用
limit_except在根路径下收紧基础接口:location /api/ {<br> limit_except GET POST HEAD OPTIONS { deny all; }<br> proxy_pass http://backend;<br>} - 对高危方法单独拦截更稳妥:
if ($request_method ~ ^(TRACE|TRACK|CONNECT|PATCH|DELETE)$) { return 405; } - 注意:OPTIONS 必须显式放行并返回 204,否则跨域预检失败
阻断含空字节、编码异常的恶意 URI
%00 截断是经典解析绕过手法,常用于上传文件执行、路径遍历等攻击:
- 全局拦截所有含
%00的请求:if ($request_uri ~ "%00") { return 403; } - 同时限制上传目录 PHP 执行能力:
location ^~ /uploads/ {<br> location ~ \.php$ { deny all; }<br>} - 配合后端关闭
cgi.fix_pathinfo=0,杜绝 FastCGI 二次解析
限制非可信 Referer 和异常 User-Agent
虽 Referer 可伪造,但对批量爬虫和低级扫描器仍有筛选价值;UA 则可快速过滤已知攻击工具指纹:
- 屏蔽常见扫描器 UA:
if ($http_user_agent ~* "(sqlmap|nikto|dirb|acunetix|nessus)") { return 444; } - 对需 Referer 校验的接口(如后台管理类 API),只允许内部域名:
if ($http_referer !~ "^https?://(app\.example\.com|admin\.example\.net)/") { return 403; } - 慎用 Referer 防盗链于纯 API 场景——移动端、命令行调用通常无 Referer,易误伤


















