知识卡片
HSTS防御SSLStrip:让浏览器提前记住这个域名必须强制走HTTPS
内容
即使一个网站已经正确部署了HTTPS,仍然存在一个常被忽视的攻击窗口:用户在浏览器地址栏输入网址时,习惯上通常不会主动输入”https://“前缀,这意味着浏览器发出的第一个请求默认走的是不安全的HTTP协议,只有服务器返回跳转之后才会切换到HTTPS——而这第一个HTTP请求本身,是完全可能被中间人劫持的(这种攻击手法称为SSLStrip),一旦第一步就被劫持,黑客就可以在这个不安全的通道上持续篡改后续的请求和响应内容。HSTS(HTTP严格传输安全)解决的正是这个问题:网站通过一个响应头明确告诉浏览器”这个域名(也可以包含子域名)今后的所有访问都必须走HTTPS”,浏览器会把这个规则记住,下次用户再访问这个网站时,即使用户还是习惯性地没有输入https前缀,浏览器也会在发出请求之前就自动把协议改写成HTTPS,从而彻底跳过了那个容易被劫持的”第一次HTTP请求”环节。这是一个通用的安全设计思路:当某个协议流程里天然存在一个”降级到不安全状态”的默认起点时,解法是让客户端提前记住一条强制升级的规则,从源头上消除这个降级窗口,而不是等到降级已经发生后再想办法补救。
参考来源
- 位置:《高可用架构(第1卷)》第7章《安全与网络》"7.5 互联网主要安全威胁分析及应对方案"节,"7.5.2 威胁应对方案","5.HTTPS"(源文件:_epub-src/OEBPS/Text/Chapter7_5_3.xhtml)
- 结论依据:原文说明"首先来说SSLStrip,你打开www.example.com的时候,一般不会在前面输入https://,那这时第一个请求便是HTTP的,而不是安全的HTTPS的,这样就可以同样被劫持了……这时候就需要帮忙,HSTS告诉浏览器:我这个域名(也可能包含子域名),加载的时候必须是HTTPS。这样在再次加载的时候就不会被绕过了",直接支撑本卡片结论。
- 原始内容:首先来说SSLStrip,你打开www.example.com的时候,一般不会在前面输入https://,那这时第一个请求便是HTTP的,而不是安全的HTTPS的,这样就可以同样被劫持了……HSTS告诉浏览器:我这个域名(也可能包含子域名),加载的时候必须是HTTPS。