Nginx配置origin限制以修复CORS跨域漏洞的方案如下:
理解CORS与Origin头CORS(跨域资源共享)通过Origin请求头标识请求来源,服务器需验证其合法性。若配置不当(如通配符*),可能导致任意域跨域访问,引发安全风险。
当前配置问题
原配置中,若Origin不在白名单(如
http://172.20.216.1:9000
),会返回505错误并设置无效的Access-Control-Allow-Origin: 123,但逻辑存在缺陷:$andflag拼接可能导致误判(如11与1比较)。
未处理Origin为空的情况,可能绕过限制。
修复后的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;}关键改进点
明确白名单验证:仅允许
http://172.20.216.1:9000
,其他Origin直接返回403。移除冗余逻辑:避免$andflag的复杂拼接,简化条件判断。
安全增强:删除默认头后显式控制CORS响应,防止意外通配。
测试验证
合法请求:
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头。扩展建议
如需支持多域名,使用正则匹配:
if ($http_origin ~* "^(https?://(domain1.com|domain2.org))(:d+)?$") { set $cors $http_origin;}动态配置:结合map指令更高效地管理白名单。
通过以上配置,可严格限制跨域访问,避免CORS漏洞导致的安全风险。