跨域资源共享漏洞修复
一、前言
跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。
我们的产品未对请求的源做限制,而是直接使用了request中的origin地址。如下:
| URL | http://10.196.122.84:9015/ServiceCenter/ |
| 弱点 | Any origin is accepted |
| 请求头 | GET /ServiceCenter/ HTTP/1.1 Host: 10.196.122.84:9015 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; rv 11.0) like Gecko Cookie: JSESSIONID=DE3C957DF28C9A70B096477B615C3343; Accept: */* Accept-Encoding: gzip,deflate Origin: https://www.evil.com |
| 响应头 | HTTP/1.1 200 Cache-Control: no-cache, no-store, must-revalidate Pragma: no-cache Expires: 0 Access-Control-Allow-Origin: https://www.evil.com Access-Control-Allow-Methods: POST, GET Access-Control-Max-Age: 1800 Access-Control-Allow-Headers: x-requested-with Access-Control-Allow-Credentials: true Content-Type: text/html;charset=UTF-8 Content-Length: 407 Date: Mon, 27 Mar 2023 12:18:11 GMT |
二、解决方案
2.1 Openresty方案
5.2版本在2020年9月份以后的版本,所有的应用访问都需要经过OpenResty,所以我们只需要在OpenResty配置就可以了,示例如下:
#设置CORS策略,只允许来自https://example.com的跨域请求
location / {
if ($http_origin != "https://example.com") {
return 403;
}
#
add_header 'Access-Control-Allow-Origin' 'https://example.com' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
#
proxy_hide_header Access-Control-Allow-Origin;
proxy_hide_header Access-Control-Allow-Methods;
proxy_hide_header Access-Control-Allow-Headers;
proxy_hide_header Access-Control-Allow-Credentials;
#
# OPTIONS请求直接返回空响应体
if ($request_method = 'OPTIONS') {
add_header 'Content-Length' 0;
add_header 'Content-Type' 'text/plain; charset=utf-8';
return 204;
}
#
# 其他操作
}
2.2 Tomcat方案
5.2在2020年6月份及其以前版本,或者需要直接访问Tomcat的环境,可以进行如下设置:
- 在tomcat的web.xml(<tomcat路径>/conf/web.xml)中增加如下内容:
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 这一行往上都不要动,在welcome-file-list后面添加如下内容 -->
<!-- The CORS filter definition -->
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<param-name>cors.allowOrigin</param-name>
<!-- <param-value>*</param-value> -->
<!-- 允许访问的网站,多个时用逗号分隔 -->
<param-value>http://examples.com,https://examples111.com</param-value>
</init-param>
<init-param>
<param-name>cors.exposedHeaders</param-name>
<param-value>Set-Cookie</param-value>
</init-param>
<init-param>
<param-name>cors.supportsCredentials</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- The CORS filter mapping -->
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 在tomcat的lib(<tomcat路径>/lib)下面增加两个jar(下载链接)
- cors-filter
- java-property-utils
- 重启tomcat
浙公网安备 33010602011771号