记一次HTTP Status 307缓存的处理
今天遇到使用HTTP访问某个域名时Chrome自动返回307,重定向到HTTPS去了。由于是开发调试,这是本不希望的情况。经研究发现,现代浏览器和服务器都开始支持 HSTS(HTTP Strict Transport Security) 功能,即自动将不安全的 HTTP 请求使用 307 Internal Redirect 跳转到 HTTPS 请求。这是由Chrome内部HSTS缓存导致的。Chrome 会自动记住每个域的 HSTS 设置,也就是说HSTS只要在理论上的第一次暴露后,后来就不经网页服务器返回,浏览器会查询本地数据,直接伪造 HSTS 307 跳转到安全的 HTTPS,以此来加强网络访问的安全性。
这的确是个很先进的功能,但对开发人员的调试环境就带来了麻烦,一旦网页服务器设置了 HSTS,且在理论上的第一次无意或有意访问过,这就被浏览器缓存住了。此后,浏览器自行决定将不会再访问该域的 HTTP了,哪怕服务端已经修改了相关配置。
解决方法:在Chrome打开 chrome://net-internals/#hsts ,在Query HSTS/PKP domain段可以查询您访问的域名是否有HSTS缓存,存在的话,在Delete domain security policies段中删除即可。
补充一些网络上的关于301,302,303,307的介绍:
在HTTP/1.1中,新增了303 See Other、307 Temporary Redirect这两个状态码,这两个状态码和301、302状态码有什么区别呢?
1. 对于301、302的location中包含的重定向url,如果请求method不是GET或者HEAD,那么浏览器是禁止自动重定向的,除非得到用户的确认,因为POST、PUT等请求是非冥等的(也就是再次请求时服务器的资源可能已经发生了变化)。
2. 虽然rfc明确了上述的规定,但是很多的浏览器不遵守这条规定,无论原来的请求方法是什么都会自动用GET方法重定向到location指定的url。就是说现存的很多浏览器在遇到POST请求返回301、302状态码的时候自动用GET请求location中的url,无需用户确认。
3. HTTP 1.1中新增了303、307状态码,用来明确服务器期待客户端进行何种反应。
4. 303状态码其实就是上面301、302状态码的”不合法”动作,指示客户端可以自动用GET方法重定向请求location中的url,无需用户确认。也就是把前面301、302状态码的处理动作”合法化”了。
5. 307状态码就是301、302原本需要遵守的规定,除GET、HEAD方法外,其他的请求方法必须等客户确认才能跳转。
6. 303、307其实就是把原来301、302不”合法”的处理动作给”合法化”,因为发现大家都不太遵守,所以干脆就增加一条规定。
HSTS介绍:
HSTS(HTTP Strict Transport Security)国际互联网工程组织IETF正在推行一种新的Web安全协议
HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。
国际互联网工程组织IETE正在推行一种新的Web安全协议HTTP Strict Transport Security(HSTS),采用HSTS协议的网站将保证浏览器始终连接到该网站的HTTPS加密版本,不需要用户手动在URL地址栏中输入加密地址。该协议将帮助网站采用全局加密,用户看到的就是该网站的安全版本。HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。比如,https://xxx 的响应头含有Strict-Transport-Security: max-age=31536000; includeSubDomains。这意味着两点:在接下来的一年(即31536000秒)中,浏览器只要向xxx或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。比如,用户点击超链接或在地址栏输入 http://xxx/ ,浏览器应当自动将 http 转写成 https,然后直接向 https://xxx/ 发送请求。
在接下来的一年中,如果 xxx 服务器发送的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字段,用户将不再允许忽略警告。