Nginx配置origin限制CORS跨域漏洞(应对等保渗透)

线上系统在等保测评的时候被扫出来了CORS跨域问题,但是根据网上大多数人用的方法之后,发现,还是能被扫出来问题,被这个问题困扰了很久,才找到了问题的解决方案,亲测有效!!!

1、问题扫描报告

2、百度推荐使用最多的方案(复测还有)

解决思路其实很简单:通过Nginx配置请求头,拦截掉非法的Origin请求方式。

网上最多的建议:

在Nginx中配置,单纯的加 "add_header Access-Control-Allow-Origin" 是没有丝毫作用的,加上之后还是能被扫到这个漏洞,如下代码段:

javascript 复制代码
location / {
  add_header Access-Control-Allow-Origin *.xxx.com;
  add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
  add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}

3、有效解决方案总结

(1)http下配置 map指令 (这个可以)

1)在http中定义一个通过map指令,定义跨域规则并返回是否合法

javascript 复制代码
http {
    ...
    # 说明:一般使用http_origin来进行跨域控制,当不传递origin头的时候,就为这个里面的默认值,当传递有值得时候,才会走下面得正则匹配
    map $http_origin $allow_cors {
        default 1;
        #以下为提供参考的正则表达式
        "~^https?://.*?\.theorydance\.com.*$" 1;
        "~^(https?://(dmp.xxxxxx.cn)?)$" 1;
        "~http://www.diuut.com" 1;
        "~*" 0;
    }
    server {
        location / {
            if ($allow_cors = 0){
                return 403;
            }
            root /data/deploy;
        }
    }
}

上述规则中,

a.当不传递origin头的时候,就为这个里面的默认值为1,

b.如果orgin的值为https://dmp.xxxxxx.cn或者含"theorydance"的,我们认为是合法的请求,返回数值1,如果是其它值,返回数值0

2)在server中根据$allow_cros的值进行请求拦截

javascript 复制代码
if ($allow_cros = 0){
     return 403;
}

3)在server中添加头部

javascript 复制代码
#指定允许其他域名访问        
add_header Access-Control-Allow-Origin $http_origin;
#允许的请求类型
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
#许的请求头字段
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";

验证:

1、不指定 origin时,请求正常

2、指定合法 origin时,请求正常

3、指定非法origin时,请求返回403

(2) server下配置 (这个感觉没有什么作用)

javascript 复制代码
server {
set $cors_origin "";  
if ($http_origin ~* "^http://19.142.15.54$") {  
   set $cors_origin $http_origin?;  
}  

add_header Access-Control-Allow-Origin $cors_origin;

listen       9101;
server_name  localhost;

     location / {
         root   /usr/share/nginx/html/gzt/;
         index  index.html index.htm;
         add_header Access-Control-Allow-Origin $cors_origin;
     }
}

(3) 方法三:server下配置 (这个可以)

Nginx if语法不支持if条件的逻辑与&&逻辑或|| 运算 ,而且不支持if的嵌套语法。需要借助变量来实现嵌套语法或多条件判断:

javascript 复制代码
server {
    listen       9101;
    server_name  localhost;

    #如果存在Origin头且Origin头不匹配指定的IP地址模式,那么返回403错误。
    set $flag 0;
    #Origin有值的情况下。flag为01
    if ($http_origin) {
        set $flag "${flag}1";
    }
    #Origin有值且不符合以下判断,flag为012
    if ($http_origin !~ "19.166.2.54.*") {
        set $flag "${flag}2";
    }    
    if ($flag = "012") {
        return 403;
    }
}

****注释****

首先,根据给出的Nginx配置代码,我们来分析各部分的逻辑:

$flag 初始值为0。

如果 http_origin 有值,则 flag 加上 "1"。

如果 http_origin 的值不匹配正则表达式 "19.166.2.54.\*",则 flag 加上 "2"。

最后,如果 $flag 的值为 "012",则返回403。

相关推荐
秋水无痕22 分钟前
# 手把手教你从零搭建 AI 对话系统 - React + Spring Boot 实战(一)
前端·后端
高桥凉介发量惊人23 分钟前
基础与工程篇-多环境配置(dev/test/prod)与打包策略
前端
墨鱼笔记24 分钟前
前端必看:Vite.config.js 最全配置指南 + 实战案例
前端·vite
kyriewen25 分钟前
异步编程:从“回调地狱”到“async/await”的救赎之路
前端·javascript·面试
前端Hardy28 分钟前
别再手动写 loading 了!封装一个自动防重提交的 Hook
前端·javascript·vue.js
前端Hardy29 分钟前
前端如何实现“无感刷新”Token?90% 的人都做错了
前端·javascript·vue.js
秋水无痕30 分钟前
# 手把手教你从零搭建 AI 对话系统 - React + Spring Boot 实战(二)
前端·后端·面试
SuperEugene38 分钟前
Vue Router 实战规范:path/name/meta 配置 + 动态 / 嵌套路由,统一团队标准|状态管理与路由规范篇
开发语言·前端·javascript·vue.js·前端框架
TEC_INO39 分钟前
嵌入式 Linux 开发知识总结
linux·运维·服务器
养生技术人1 小时前
Oracle OCP认证考试题目详解082系列第5题
运维·数据库·sql·oracle·开闭原则