Nginx配置origin限制跨域请求(应对等保)

Nginx需要修复一个CORS安全漏洞
其中单纯的加 “add_header Access-Control-Allow-Origin” 是没有丝毫作用的

表示当前请求资源所在页面的协议和域名,用来说明请求从哪里发起的,如http://test.my.com,
特别注意:
这个参数一般只存在于CORS跨域请求或者 POST 请求中,普通请求没有这个header!
如果有Origin参数,我们可以看到response有对应的header:Access-Control-Allow-Origin
Origin知识点相关链接:
https://juejin.cn/post/6844903954455724045
https://blog.csdn.net/xiaolinlife/article/details/119825880

在这里插入图片描述
在这里插入图片描述
这个需要根据客户端传递的请求头中的Origin值,进行安全的跨站策略配置,目的是对非法的origin直接返回403错误页面,配置如下:

(1) 方法一:http下配置 map指令 (这个可以)

注意:在Nginx中,map指令通常用于定义一个变量映射,它只能放在http块内

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

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的值进行请求拦截

if ($allow_cros = 0){
     return 403;
}

3、在server中添加头部

#指定允许其他域名访问        
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下配置 (这个感觉没有什么作用)

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的嵌套语法。
需要借助变量来实现嵌套语法或多条件判断
【1】https://www.cnblogs.com/opensmarty/p/17119003.html

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。

现在,我们针对给定的情况($http_origin 没有值)进行分析:
由于 h t t p o r i g i n 没有值,第 2 和第 3 个条件都不满足。因此, http_origin 没有值,第2和第3个条件都不满足。因此, httporigin没有值,第2和第3个条件都不满足。因此,flag 保持其初始值0。
所以,如果 $http_origin 没有值,最终 $flag 的值为 “0”。则可以继续往下执行

参考链接
https://www.cnblogs.com/justtosee/p/16987894.html
https://www.cnblogs.com/TheoryDance/p/16277577.html

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
配置Nginx以忽略跨域请求,你可以通过以下步骤进行设置: 1. 打开Nginx配置文件,通常位于/etc/nginx/nginx.conf。 2. 在http块中添加一个变量$allow_cors来控制是否允许跨域请求。默认情况下,将该变量设置为1,表示允许跨域请求。 3. 添加一个server块来监听特定的端口(例如8180)。 4. 在server块内添加一个if语句来检查$allow_cors变量的值。如果$allow_cors等于0,则返回403禁止访问。 5. 配置location指令来指定需要处理的路径。你可以使用正则表达式来匹配路径,如"/index"和"/accusation"。 6. 在location块内使用proxy_pass指令将请求转发给后端服务。 7. 保存和关闭配置文件。 8. 重新启动Nginx服务,使配置生效。 以下是一个示例配置: ```nginx worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; map $http_origin $allow_cors { default 1; "~^(https?://(localhost)(:[0-9])?)$" 1; "~*" 0; } server { listen 8180; if ($allow_cors = 0) { return 403; } location / { root html; index index.html index.htm; } location /index { proxy_pass http://localhost:8080/accusation; } location /accusation { proxy_pass http://localhost:8080/accusation; } } } ``` 另外,你还可以使用正则表达式来匹配指定的路径并禁止跨域请求。下面是一个示例配置: ```nginx worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; map $http_origin $allow_cors { default 1; "~^(https?://(localhost)(:[0-9])?)$" 1; "~*" 0; } server { listen 8180; if ($request_uri ~ ^accu.*$) { set $allow_cors "2$allow_cors"; } if ($allow_cors = "21") { return 403; } location / { root html; index index.html index.htm; } location /index { proxy_pass http://localhost:8080/accusation; } location /accusation { proxy_pass http://localhost:8080/accusation; } } } ``` 这样配置后,Nginx将忽略跨域请求,并只允许特定的请求通过。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值