【计算机网络】精准控制跨域范围


问题描述

CORS 跨域资源共享漏洞:应用程序接受来自任何 Origin 的 CORS 请求。该代码将 Origin 值放在 HTTP 响应头Access-Control-Allow-Origin 中。现在,此配置将允许来自任何 Origin 的任何脚本向应用程序发出 CORS 请求。Web 浏览器将执行标准的CORS 请求检查,来自恶意域的脚本将能够窃取数据。


解决方案:

1. pom.xml引入tomcat允许跨域访问的包

		<dependency>
    		<groupId>com.thetransactioncompany</groupId>
    		<artifactId>cors-filter</artifactId>
    		<version>2.5</version>
		</dependency>

2. web.xml配置跨域访问规则

	<filter>
        <filter-name>CORS</filter-name>
        <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
        <init-param>
            <param-name>cors.allowGenericHttpRequests</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>cors.allowOrigin</param-name>
            <param-value>*</param-value>
        </init-param>
        <init-param>
            <param-name>cors.allowSubdomains</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>cors.supportedMethods</param-name>
            <param-value>GET, HEAD, POST,OPTIONS,PUT</param-value>
        </init-param>
        <init-param>
            <param-name>cors.supportedHeaders</param-name>
            <param-value>*</param-value>
        </init-param>
        <init-param>
            <param-name>cors.exposedHeaders</param-name>
            <param-value>X-Test-1, X-Test-2</param-value>
        </init-param>
        <init-param>
            <param-name>cors.supportsCredentials</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>cors.maxAge</param-name>
            <param-value>3600</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>CORS</filter-name>
        <url-pattern>/*
    
   

3. 访问规则解析

 1. cors.allowGenericHttpRequests {true|false} 默认为 true
如果true允许通用 HTTP 请求通过过滤器,则只允许有效和接受的 CORS 请求(严格的 CORS 过滤)。

 2. cors.allowOrigin {"*"|origin-list} 默认为 * (仅支持:*、空、完整域名)
CORS 过滤器必须允许的以空格分隔的来源列表。来自此处未包含的来源的请求将被拒绝并 返回 HTTP 403 “禁止”响应。如果设置为*(星号),则允许任何来源。
示例:仅允许来自以下三个来源的跨域请求:
"http://example.com, http://example.com:8080, https://secure.net"
注意:不支持  *example.com 匹配规则

 3. cors.allowSubdomains {true|false} 默认为 false (用来精准匹配某个域名下的所有子域名)
如果true CORS 过滤器将允许来自任何来源的请求,该来源是 允许来源的子域来源。通过比较其方案和后缀(主机名/IP 地址和可选端口号)来匹配子域。
示例:如果明确允许的来源是 "http://example.com" 并且允许子域,则以下所有来源也将被允许:
"http://www.example.com"
"http://foo.example.com"
"http://bar.example.com"
但是,这些不匹配的来源将被拒绝:
"http://www.example.com:8080"
"http://myexample.com"
备注:不区分http和https 限制的仅仅是父域名规则

 4. cors.supportedMethods {method-list}默认为"GET, POST, HEAD, OPTIONS, PUT"
支持的 HTTP 方法列表。这些是通过 Access-Control-Allow-Methods 标头公布的,并且还必须由实际的 CORS Web 服务实现。CORS 过滤器将拒绝对此处未包含的方法的请求,并返回 HTTP 405 “不允许的方法”响应。
注意:富文本跨域需要配置  PUT

4. web.xml 允许子域跨域访问配置规则

	<filter>
        <filter-name>CORS</filter-name>
        <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
        <init-param>
            <param-name>cors.allowGenericHttpRequests</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>cors.allowOrigin</param-name>
            <param-value>http://example.com, https://secure.net, wss://example.cn
        </init-param>
        <init-param>
            <param-name>cors.allowSubdomains</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>cors.supportedMethods</param-name>
            <param-value>GET, HEAD, POST,OPTIONS,PUT</param-value>
        </init-param>
        <init-param>
            <param-name>cors.supportedHeaders</param-name>
            <param-value>*</param-value>
        </init-param>
        <init-param>
            <param-name>cors.exposedHeaders</param-name>
            <param-value>X-Test-1, X-Test-2</param-value>
        </init-param>
        <init-param>
            <param-name>cors.supportsCredentials</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>cors.maxAge</param-name>
            <param-value>3600</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>CORS</filter-name>
        <url-pattern>/*
    
   

你可能感兴趣的:(网络安全,tomcat,java)