Nginx配置origin限制,修复CORS跨域漏洞

大哥大姐们有没有人讲详细点的我想问一下,Nginx配置origin限制,修复CORS跨域漏洞
最新回答
肆无忌惮的思念

2026-10-22 20:47:08

Nginx配置origin限制以修复CORS跨域漏洞的方案如下:

  1. 理解CORS与Origin头CORS(跨域资源共享)通过Origin请求头标识请求来源,服务器需验证其合法性。若配置不当(如通配符*),可能导致任意域跨域访问,引发安全风险。

  2. 当前配置问题

    原配置中,若Origin不在白名单(如

    http://172.20.216.1:9000
    ),会返回505错误并设置无效的Access-Control-Allow-Origin: 123,但逻辑存在缺陷:

    $andflag拼接可能导致误判(如11与1比较)。

    未处理Origin为空的情况,可能绕过限制。

  3. 修复后的Nginx配置

    location /abc/ { # 删除默认的通配符头 proxy_hide_header Access-Control-Allow-Origin; # 检查Origin是否存在且合法 set $cors ""; if ($http_origin ~* "^
    http://172.20.216.1:9000
    $") { set $cors $http_origin; } # 合法则添加CORS头,否则拒绝 if ($cors != "") { add_header 'Access-Control-Allow-Origin' '$cors'; add_header 'Access-Control-Allow-Credentials' 'true'; # 如需凭证 } if ($cors = "") { return 403; # 直接拒绝非法请求 } proxy_pass
    http://192.168.119.2:8095/;
    proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 100m;}
  4. 关键改进点

    明确白名单验证:仅允许

    http://172.20.216.1:9000
    ,其他Origin直接返回403。

    移除冗余逻辑:避免$andflag的复杂拼接,简化条件判断。

    安全增强:删除默认头后显式控制CORS响应,防止意外通配。

  5. 测试验证

    合法请求:

    curl -H 'Origin:
    http://172.20.216.1:9000'
    http://10.14.32.138:80/abc/
    应返回200及正确的Access-Control-Allow-Origin头。

    非法请求:

    curl -H 'Origin:
    http://aaa.bbb'
    http://10.14.32.138:80/abc/
    应返回403,无CORS头。
  6. 扩展建议

    如需支持多域名,使用正则匹配:

    if ($http_origin ~* "^(https?://(domain1.com|domain2.org))(:d+)?$") { set $cors $http_origin;}

    动态配置:结合map指令更高效地管理白名单。

通过以上配置,可严格限制跨域访问,避免CORS漏洞导致的安全风险。