nginx–基础–3.15–案例–只允许指定的网站进行跨域请求
1、不安全的CORS配置
- 测试人员访问某个url,将请求头中的Origin字段修改为任意值,结果仍然能获得正确的响应报文,就说明有CORS漏洞。
- 当响应头中的
Access-Control-Allow-Origin
设置为null或*
时,表示信任任何域,这时候就可能引入安全问题。 - 修复方法:不让在nginx或tomcat中配置
Access-Control-Allow-Origin *
Access-Control-Allow-Origin null
。
1.1、测试截图
1.2、风险
CORS可以共享许多内容,但它是一个相对盲目的协议,只是通过HTTP头来控制,因此它会带来一定的风险,包括:
- HTTP头只能说明请求来自一个特定的域,但是并不能保证这个事实,因为HTTP头可以被伪造,所以未经身份验证的跨域请求应该永远不会被信任。如果一些重要的功能需要暴露或者返回敏感信息,应该需要验证Session ID。
- 恶意跨域请求,即便页面只允许来自某个信任网站的请求,但是它也会收到大量来自其他域的跨域请求,这些请求有时可能会被用于执行应用层面的DDOS攻击,并不应该被应用来处理。
- 内部信息泄漏,假定一个内部站点开启了CORS,如果内部网络的用户访问了恶意网站,恶意网站可以通过CORS(跨域请求)来获取到内部站点的内容。
1.3、修复建议
- 配置白名单,只允许特定的
Access-Control-Allow-Origin
头,并拒绝白名单以外的域名进行访问; - 通过多种条件屏蔽掉非法的请求,例如HTTP头、参数等;
- 如果使用了反向代理等功能,则需要配置在最里层的中间件;
可参考以下链接中的配置方式:
https://blog.csdn.net/BHSZZY/article/details/119024992
https://www.cnblogs.com/wenyoudo/p/14862701.html
2、操作
在nginx配置文件中配置:
# 方式:添加允许跨域的域名:这里使用正则
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";
}
# 方式:指定域名
location / {
add_header Access-Control-Allow-Origin http://www.hao123.com;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}
# 方式:指定ip与端口,可以逗号拼接;
location / {
add_header Access-Control-Allow-Origin http://10.130.222.222:6500,http://10.130.222.223:6500;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}
# 方式:使用正则表达式;
location ~ /myurl(.*) {
if ( $http_origin ~ '^http(s)?://(localhost|10\.130\.222\.222):6500$' ){
add_header Access-Control-Allow-Origin $http_origin;
}
if ( $http_origin ~ '^http(s)?://(localhost|10\.130\.222\.223):6500$' ){
add_header Access-Control-Allow-Origin $http_origin;
}
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}