HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式.
作用
一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入https://foo.com或者直接foo.com。
这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。
网站通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求。
现实案例
你连接到一个免费WiFi接入点,然后开始浏览网站,访问你的网上银行,查看你的支出,并且支付一些订单。很不幸,你接入的WiFi实际上是黑客的笔记本热点,他们拦截了你最初的HTTP请求,然后跳转到一个你银行网站一模一样的钓鱼网站。 现在,你的隐私数据暴露给黑客了。
Strict Transport Security解决了这个问题;只要你通过HTTPS请求访问银行网站,并且银行网站配置好Strict Transport Security,你的浏览器知道自动使用HTTPS请求,这可以阻止黑客的中间人攻击的把戏。
启用 Strict Transport Security
开启HSTS只需要当通过HTTPS方式访问你的网站时,返回 Strict-Transport-Security
HTTP 头信息:
Strict-Transport-Security: max-age=expireTime [; includeSubdomains]
-
expireTime
- 过期时间,单位秒,浏览器需要记住这个网站只能通过HTTPS访问的时间。
-
includeSubdomains
可选 - 如果这个可选的参数定义了,这条规则对于网站的所有子域同样生效。
Strict-Transport-Security
头信息当通过HTTP请求传递,会被浏览器忽略; 这是因为攻击者可能拦截或者篡改HTTP连接头。当你的网站通过HTTPS连接并且没有证书错误,浏览器知道你的网站能够支持HTTPS,并且接受Strict-Transport-Security头信息
.浏览器如何处理
你的网站第一次通过HTTPS请求,服务器响应Strict-Transport-Security
头,浏览器记录下这些信息,然后后面尝试访问这个网站的请求都会自动把HTTP替换为HTTPS。
当HSTS头设置的过期时间到了,后面通过HTTP的访问恢复到正常模式,不会再自动跳转到HTTPS。
每次浏览器接收到Strict-Transport-Security头,它都会更新这个网站的过期时间,所以网站可以刷新这些信息,防止过期发生。
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 4.0.211.0 | Unknown (4.0) | Not supported | 12 | 7 on Maverics |
Feature | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Basic support | 18 | 4.0 (4.0) | Not supported | ? | Not supported |
Specification
See also
- Blog post: HTTP Strict Transport Security has landed!
- Blog post: HTTP Strict Transport Security (force HTTPS)
- OWASP Article: HTTP Strict Transport Security
- Wikipedia: HTTP Strict Transport Security