Nginx配置origin限制跨域请求-应对等保
- (1) 方法一:http下配置 map指令 (这个可以)
- (2) 方法二:server下配置 (这个感觉没有什么作用)
- (3) 方法三:server下配置 (这个可以)
Nginx需要修复一个CORS安全漏洞
其中单纯的加 “add_header Access-Control-Allow-Origin” 是没有丝毫作用的表示当前请求资源所在页面的协议和域名,用来说明请求从哪里发起的,如http://test.my.com,
特别注意:
这个参数一般只存在于CORS跨域请求或者 POST 请求中,普通请求没有这个header!
如果有Origin参数,我们可以看到response有对应的header:Access-Control-Allow-Origin
Origin知识点相关链接:
这个需要根据客户端传递的请求头中的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】
server {
listen 9101;
server_name localhost;
#如果Origin头不匹配指定的IP地址模式,并且存在Origin头,那么返回404错误。
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 404;
}
}
首先,根据给出的Nginx配置代码,我们来分析各部分的逻辑:
$flag 初始值为0。
如果 $http_origin 有值,则 $flag 加上 “1”。
如果 $http_origin 的值不匹配正则表达式 “19.166.2.54.*”,则 $flag 加上 “2”。
最后,如果 $flag 的值为 “012”,则返回404。现在,我们针对给定的情况($http_origin 没有值)进行分析:
由于 flag 保持其初始值0。
所以,如果 $http_origin 没有值,最终 $flag 的值为 “0”。