记一次HTTP Status 307缓存的处理
记一次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状态码
有什么区别呢?
- 对于301、302的location中包含的重定向url,如果请求method不是GET或者HEAD,那么浏览器是禁止自动重定向的,除非得到用户的确认,因为POST、PUT等请求是非冥等的(也就是再次请求时服务器的资源可能已经发生了变化)。
- 虽然rfc明确了上述的规定,但是很多的浏览器不遵守这条规定,无论原来的请求方法是什么都会自动用GET方法重定向到location指定的url。就是说现存的很多浏览器在遇到POST请求返回301、302状态码的时候自动用GET请求location中的url,无需用户确认。
- HTTP 1.1中新增了303、307状态码,用来明确服务器期待客户端进行何种反应。
- 303状态码其实就是上面301、302状态码的”不合法”动作,指示客户端可以自动用GET方法重定向请求location中的url,无需用户确认。也就是把前面301、302状态码的处理动作”合法化”了。
- 307状态码就是301、302原本需要遵守的规定,除GET、HEAD方法外,其他的请求方法必须等客户确认才能跳转。
- 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字段
,用户将不再允许忽略警告
。