跨域资源共享漏洞修复

一、前言

 

      跨域资源共享(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
posted @ 2024-02-22 10:25  陶清刚  阅读(250)  评论(0)    收藏  举报