HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式。
背景
有的网站开启了https,但为了照顾用户的使用体验(因为用户总是很赖的,一般不会主动键入https,而是直接输入域名, 直接输入域名访问,默认就是http访问)同时也支持http访问,当用户http访问的时候,就会返回给用户一个302重定向,重定向到https的地址,然后此后的访问都使用https传输。
这种通信模式看起来貌似没有问题,但仔细分析,就会发现种通信模式也存在一个风险,那就是这个302重定向可能会被劫持篡改,如果被改成一个恶意的或者钓鱼的https站点(比如将Host头篡改到钓鱼网站),用户的账号密码极有可能泄露。
对于篡改302的攻击,建议服务器开启HTTP Strict Transport Security功能,这个功能的含义是:
当用户已经安全的登录开启过HSTS功能的网站 (支持HSTS功能的站点会在响应头中插入:Strict-Transport-Security) 之后,支持HSTS的浏览器(比如Chrome,Firefox)会自动将这个域名加入到HSTS列表,下次即使用户使用http访问这个网站,支持HSTS功能的浏览器就会自动发送https请求(前提是用户没有清空缓存,如果清空了缓存,第一次访问还是明文,后续浏览器接收到服务器响应头中的Strict-Transport-Security,就会把域名加入到HSTS缓存中,然后才会在发送请求前将http内部转换成https),而不是先发送http,然后重定向到https,这样就能避免中途的302重定向URL被篡改,进一步提高通信的安全性。
启用HSTS
在Apache的httpd.conf或.htaccess文件中添加:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
扩展阅读:
HTTP Strict Transport Security实战详解
Apache虚拟主机中启用HSTS
防止Web攻击,做好HTTP安全标头
懂这些,你将能构建更安全的Web应用