HTTP响应头处理。网页嵌套问题、http缓存设置

3 篇文章 0 订阅

HTTP响应头处理
HTTP响应头中的许多属性都可以用来提高Web安全。我们来看一下Spring Security中提供显示支持的一些HTTP响应头

Spring Security默认情况下 显式支持的HTTP相应头主要有以下几种:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
这些响应头都是在HeaderWriterFilter中添加的,默认情况下,该过滤器就会添加到Spring Security过滤器链中,HeaderWriterFilter是通过HeadersConfigure进行配置的,我们看一下HeadersConfigure的几个关键方法

public void configure(H http) {
HeaderWriterFilter headersFilter = this.createHeaderWriterFilter();
http.addFilter(headersFilter);
}

private HeaderWriterFilter createHeaderWriterFilter() {
    List<HeaderWriter> writers = this.getHeaderWriters();
    if (writers.isEmpty()) {
        throw new IllegalStateException("Headers security is enabled, but no headers will be added. Either add headers or disable headers security");
    } else {
        HeaderWriterFilter headersFilter = new HeaderWriterFilter(writers);
        headersFilter = (HeaderWriterFilter)this.postProcess(headersFilter);
        return headersFilter;
    }
}

private List<HeaderWriter> getHeaderWriters() {
    List<HeaderWriter> writers = new ArrayList();
    this.addIfNotNull(writers, this.contentTypeOptions.writer);
    this.addIfNotNull(writers, this.xssProtection.writer);
    this.addIfNotNull(writers, this.cacheControl.writer);
    this.addIfNotNull(writers, this.hsts.writer);
    this.addIfNotNull(writers, this.frameOptions.writer);
    this.addIfNotNull(writers, this.hpkp.writer);
    this.addIfNotNull(writers, this.contentSecurityPolicy.writer);
    this.addIfNotNull(writers, this.referrerPolicy.writer);
    this.addIfNotNull(writers, this.featurePolicy.writer);
    this.addIfNotNull(writers, this.permissionsPolicy.writer);
    writers.addAll(this.headerWriters);
    return writers;
}

可以看到这里在configure方法中创建了HeaderWriterFilter过滤器,在过滤器创建时,通过getHeaderWriters方法获取到所有需要添加的相应头传入过滤器中。getHeaderWriters方法执行时,只会添加不为null的实例,默认情况下只有前五个不为null
其中:
contentTypeOptions.writer负责处理X-Content-Type-Options响应头
xssProtection.writer负责处理X-XSS-Protection
cacheControl.writer负责处理Cache-Control,Pragma,Expires响应头
hsts.writer负责处理Strict-Transport-Security响应头
frameOptions.writer负责处理X-Frame-Options响应头

接下来我们逐个分析:

缓存控制
和缓存控制有关的响应头一共有三个:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Cache-Control:Cathe-Control是HTTP/1.1中引入的缓存字段,无论是请求头还是相应头都支持该字段,其中no-store表示不做任何缓存,每次请求都会从服务端完整的下载内容,no-cache则表示缓存但是需要重新验证,这种情况下,数据虽然缓存在客户端,但是当需要使用该数据时,还是会向服务端发送请求,服务端则验证请求中所描述的缓存是否过期,如果没有过期,则返回304,客户端使用缓存,如果已经过期,则返回最新数据,max-age则表示缓存的有效期,这个有效期并非一个时间戳,而是一个秒数,指从请求发起后多少秒内缓存有效。must-revalidate表示当缓存在使用一个陈旧的资源时,必须先验证它的状态,已过期的将不被使用。

Pragma:Pragma是HTTP/1.0中定义的响应头,作用类似于Cache-Control:no-cache,但是不能代替Cache-Control,该字段主要用来兼容HTTP/1.0的客户端

Expires:Expires响应头制定了一个日期,即在指定日期之后,缓存过期。如果日期为0的话,表示缓存已经过期。

从上面的解释可以看到,Spring Security默认不做任何缓存,需要注意的是,这个是针对经过Spring Security过滤器的请求。如果请求本身没有经过过滤器链,那么该缓存的还是会缓存。

如果请求经过Spring Security过滤器链,又希望开启缓存功能,那么可以关闭Spring Security中关于缓存的默认配置

protected void configure(HttpSecurity http) throws Exception {
http.headers()
.cacheControl()
.disable();

}

X-Content-Type-Options
MIME嗅探:一般来说,浏览器通过响应头Content-Type来确定响应报文类型,但是在早期的浏览器中,为了提高用户体验,并不会严格根据Content-Type的值来解析相应报文,当Content-Type的值缺失,或者浏览器认为服务器给出了错误的Content-Type值,此时就会对相应报文进行自我解析,即自动判断报文类型然后进行解析,在这个过程中就有可能触发XSS攻击。

X-Content-Type-Options响应头相当于一个提示标志,被服务器用来提示客户端一定要遵循在Content-Type中对MIME类型的设定,而不能对其进行修改,这就禁用了客户端的MIME类型嗅探行为,换言之,就是服务端告诉客户端其对于MIME类型的设置没有任何问题。

如果开发者不想禁用MIME嗅探,可以通过以下方式从响应头中移除X-Content-Type-Options

@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers()
.contentTypeOptions()
.disable()
}
Strict-Transport-Security
Strict-Transport-Security用来指定当前客户端只能通过HTTPS访问服务器,而不能通过HTTP访问

Strict-Transport-Security: max-age=31536000 ; includeSubDomains
(1)max-age:设置在浏览器收到这个请求后的多少秒时间内,凡是访问这个域名下到的请求都使用HTTPS请求。
(2)includeSubDomains:这个参数是可选的,如果被指定,表示第一条规则也适用于子域名

这个响应头并非总是会添加,如果当前请求是HTTPS请求,这个请求头才会添加,否则该请求头就不会添加。

如果学要对Strict-Transport-Security的值进行具体配置,方式如下:

@Override
protected void configure(HttpSecurity http) throws Exception {
http .headers()
.httpStrictTransportSecurity()
.includeSubDomains(false)
.maxAgeInSeconds(3600);

}

也可以直接调用.disable()方法移除该响应头

X-Frame-Options
X-Frame-Options响应头用来告诉浏览器是否允许一个页面在,,或者中展现,通过该响应头可以确保网站没有被嵌入到其他站点中,进而避免发生打击劫持
X-Frame-Options有三种不同的取值
(1)deny:表示该页面不允许在frame中展示,即便是在相同域名的页面中嵌套也不允许。
(2)sameorign:表示该页面可以在相同域名页面的frrame中展示
(3)allow-from uri:表示该页面可以再指定来源的frame中展示
Spring Security默认取值是deny,开发者也可以对此进行修改

@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers()
.frameOptions()
.sameOrigin()

}

也可以直接调用.disable()方法移除该响应头

X-XSS-Protection
X-XSS-Protection响应头告诉浏览器,当检测到跨站脚本攻击(XSS)时,浏览器将停止加载页面,该响应头有四种不同的取值
(1)0表示禁止XSS过滤
(2)1表示启用XSS过滤(通常浏览器是默认的)。如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)
(3)1;mode=block 表示启用XSS过滤,如果检测到攻击,浏览器将不会清除页面,而阻止页面加载
(4)1;report=表示启用XSS过滤,如果检测到跨站脚本攻击,浏览器将清除页面,并使用CSP report-uri指令的功能发送违规报告

Spring Security默认设置的是1;mode=block

当然开发者也可以自己配置

@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers()
.xssProtection()
.block(false);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值