一个网站接受一个HTTP的请求,而后跳转到HTTPS,用户可能在开始跳转前,经过没有加密的方式和服务器对话,好比,用户输入http://foo.com或者直接foo.com。这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。网站经过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把全部尝试使用HTTP的请求自动替换为HTTPS请求。前端
想一想这样一种场景:git
有的网站开启了https,但为了照顾用户的使用体验(由于用户老是很赖的,通常不会主动键入https,而是直接输入域名, 直接输入域名访问,默认就是http访问)同时也支持http访问,当用户http访问的时候,就会返回给用户一个302重定向,重定向到https的地址,而后后续的访问都使用https传输,这种通讯模式看起来貌似没有问题,但细致分析,就会发现种通讯模式也存在一个风险,那就是这个302重定向可能会被劫持篡改,若是被改为一个恶意的或者钓鱼的https站点,而后,你懂得,一旦落入钓鱼站点,数据还有安全可言吗?github
对于篡改302的攻击,建议服务器开启HTTP Strict Transport Security功能,这个功能的含义是:chrome
当用户已经安全的登陆开启过htst功能的网站 (支持hsts功能的站点会在响应头中插入:Strict-Transport-Security) 以后,支持htst的浏览器(好比chrome. firefox)会自动将这个域名加入到HSTS列表,下次即便用户使用http访问这个网站,支持htst功能的浏览器就会自动发送https请求(前提是用户没有清空缓存,若是清空了缓存第一次访问仍是明文,后续浏览器接收到服务器响应头中的Strict-Transport-Security,就会把域名加入到hsts缓存中,而后才会在发送请求前将http内部转换成https),而不是先发送http,而后重定向到https,这样就能避免中途的302重定向URL被篡改。进一步提升通讯的安全性。浏览器
上面是我本身的理解,下面是owasp中文站点关于hsts的描述:缓存
HSTS的做用是强制客户端(如浏览器)使用HTTPS与服务器建立链接。服务器开启HSTS的方法是,当客户端经过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。安全
好比,example.com/ 的响应头含有Strict-Transport-Security: max-age=31536000; includeSubDomains。这意味着两点:服务器
在接下来的一年(即31536000秒)中,浏览器只要向example.com或其子域名发送HTTP请求时,必须采用HTTPS来发起链接。好比,用户点击超连接或在地址栏输入 www.example.com/ ,浏览器应当自动将 http 转写成 https,而后直接向 www.example.com/ 发送请求。网络
在接下来的一年中,若是 example.com 服务器发送的TLS证书无效,用户不能忽略浏览器警告继续访问网站。负载均衡
HSTS能够用来抵御SSL剥离攻击。SSL剥离攻击是中间人攻击的一种,由Moxie Marlinspike于2009年发明。他在当年的黑帽大会上发表的题为“New Tricks For Defeating SSL In Practice”的演讲中将这种攻击方式公开。SSL剥离的实施方法是阻止浏览器与服务器建立HTTPS链接。它的前提是用户不多直接在地址栏输入https://,用户老是经过点击连接或3xx重定向,从HTTP页面进入HTTPS页面。因此攻击者能够在用户访问HTTP页面时替换全部https://开头的连接为http://,达到阻止HTTPS的目的。
HSTS能够很大程度上解决SSL剥离攻击,由于只要浏览器曾经与服务器建立过一次安全链接,以后浏览器会强制使用HTTPS,即便连接被换成了HTTP 另外,若是中间人使用本身的自签名证书来进行攻击,浏览器会给出警告,可是许多用户会忽略警告。HSTS解决了这一问题,一旦服务器发送了HSTS字段,用户将再也不容许忽略警告。
用户首次访问某网站是不受HSTS保护的。这是由于首次访问时,浏览器还未收到HSTS,因此仍有可能经过明文HTTP来访问。
解决这个不足目前有两种方案,
因为HSTS会在必定时间后失效(有效期由max-age指定),因此浏览器是否强制HSTS策略取决于当前系统时间。部分操做系统常常经过网络时间协议更新系统时间,如Ubuntu每次链接网络时,OS X Lion每隔9分钟会自动链接时间服务器。攻击者能够经过伪造NTP信息,设置错误时间来绕过HSTS。解决方法是认证NTP信息,或者禁止NTP大幅度增减时间。好比Windows 8每7天更新一次时间,而且要求每次NTP设置的时间与当前时间不得超过15小时
目标域名:portal.fraudmetrix.cn (这个站点不支持hsts功能) 同盾科技的风险控制管理系统(打个软广,同盾科技,基于大数据,专一反欺诈)。
第一次访问:在浏览器地址栏键入:portal.fraudmetrix.cn
这个域名并不在chrome浏览器的hsts的缓存中,也不在hsts中的preload list中(像facebook、twitter等网站已经内置在preload list中,因此每次请求这些站点的时候浏览器都会自动将http 转换成htttps),因此不会在发送请求前将http转换成https请求。
咱们来把这个站点手动加入到chrome浏览器的hsts缓存中:
备注:为何咱们要求在未清空chrome浏览器的缓存前访问呢?
由于若是清空了chrome浏览器的缓存以后,咱们手动加入到hsts缓存中的域名就会被清除,也就不会看到预期的效果了。
咱们先清空chrome浏览器的缓存,而后在浏览器的地址栏中键入 www.alipay.com
而是由前端的F5的负载均衡(BigIP)器将http请求重定向到https请求。
咱们继续看看此次请求的其余响应:
浏览器在收到带有Strict-Transport-Security响应头的报文后,就会将这个站点加入到hsts缓存中,下次以http访问的时候就会被自动转换成https。
咱们这时查看如下hsts的缓存中是否是有了 www.alipay.com
这时候在未清空浏览器缓存的前提下再次访问 www.alipay.com
脸书www.facebook.com是已经加入到chrome浏览器hsts preload list中的。
看看我大百度呢?
清空chrome浏览器缓存,在地址栏键入www.baidu.com:
在看看此次请求中的其余响应报文呢: