欢迎访问陈同学博客原文
产品不断迭代,安全却很少关注,这在小团队司空见惯吗? 前两天拿到一份站点的安全检测报告:
例举几点:
本文整理几个 HTTP Security Header,属于图中的 Application Security部分。将用 nginx 来演示这些配置。通过文中材料链接可查看更详细的信息。
检测报告提示:未遵守 X-Frame-Options、X-XSS-Protection、HSTS、X-Content-Type-Options 的最佳实践,这几个都是 HTTP Response header。nginx 配置demo将在最下面给出。
X-Frame-Options 用来告诉浏览器,页面能不能以 frame、 iframe、 object 形式嵌套在其他站点中,用来避免点击劫持(clickjacking)攻击。例如用下面代码将百度以 iframe 嵌入到自己的站点,然后监听 iframe 事件做些其他事情,用户如果不看URL估计以为自己在用百度。
<iframe src="https://www.baidu.com/" width="100%" height="100%" frameborder="no">iframe>
可选值:
用于处理跨站脚本攻击 (XSS)。
可选值:
HSTS(HTTP Strict Transport Security,RFC 6797) HTTP严格传输安全 ,指告诉浏览器自动从HTTP切换到HTTPS(当然,站点得支持HTTPS)。
举例说明,如下图(nginx 将http重定向到https):
左边没加HSTS配置,301正常重定向,耗时 80ms ;
右边配置了HSTS,浏览器利用cache,直接将HTTP转成了HTTPS,耗时 2ms,免去了重定向过程。
状态从 301 变成了 307 Internal Redirect 即浏览器内部跳转。
X-Content-Type-Options 用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定,而不能对其进行修改,用于禁用了客户端的 MIME 类型嗅探行为。
当资源缺失 MIME 类型或设置了错误的 MIME 类型时,浏览器可能会通过查看资源来进行MIME嗅探。简单来说,就是如果浏览器不确定资源是什么,就会看看资源的内容,X-Content-Type-Options 就是让浏览器不要干这个事情。
可选值:
HTTP Strict Transport Security (HSTS) and NGINX
通过nginx add_header 指令在 response 中添加如下header,可以根据需要调整。add_header 可以作用于nginx的 http、server、location。
server {
listen 80;
server_name chenyongjun.vip;
location / {
add_header X-Frame-Options "DENY";
add_header X-Xss-Protection "1;mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
}
}
关于Strict-Transport-Security:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
,always用于确保所有的response设置了该header如果你使用了 Spring Security,默认会利用 HeaderWriterFilter 将上面的安全配置全部写入 response。
如果你想在流量入口统一做安全设置,可以禁用或调整应用中 Spring Security 配置。修改你自定义的 WebSecurityConfig:
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// 下面的所有实例代码都在这里
}
}
禁用 Secure Header
http.headers().disable();
禁用X-Frame-Options
其他选项不一一列出
http.headers().frameOptions().disable();
如果应用中启用了 HTTP Secure Headers,但是最终返回的Response需要剔除某个配置。在不改代码前提下,可以通过nginx来剔除,例如从response中剔除X-Frame-Options配置:
proxy_hide_header X-Frame-Options;
本文主要是想增长一丢丢安全意识,这些配置倒是次要的,还有更多的安全相关配置,需要时查查资料就好。
欢迎关注陈同学的公众号,一起学习,一起成长