什么是“升级 – 不安全 – 请求”HTTP头?

我向HTTP(非HTTPS)站点发出了一个POST请求,在Chrome的开发工具中检查了这个请求,发现它在发送给服务器之前添加了自己的头文件:

Upgrade-Insecure-Requests: 1 

在对Upgrade-Insecure-Requests进行search之后,我只能find关于发送这个头的服务器的信息 :

 Content-Security-Policy: upgrade-insecure-requests 

这似乎是相关的,但仍然有很大的不同,因为在我的情况下,客户端正在请求中发送标题,而我发现的所有信息是有关服务器在响应中发送相关的标头。


那么为什么Chrome(44.0.2403.130 m)将Upgrade-Insecure-Requests添加到我的请求中?它是做什么的?


更新2016-08-24:

此标题已被添加为W3C候选推荐标准 ,现已正式确认。

对于刚才遇到这个问题而感到困惑的人来说,西蒙·东(Simon East)的出色解答很好地解释了这一点。

在之前的W3C工作草案中 , Upgrade-Insecure-Requests: 1标头曾经是HTTPS: 1 ,并且在更改被正式接受之前由Chrome 悄然重命名。

(在这个过渡期间,这个问题被问到,当时这个头文件没有官方文档,而且Chrome是发送这个头文件的唯一浏览器。)

简短回答:它与Content-Security-Policy: upgrade-insecure-requests响应头紧密相关,表示浏览器支持它(实际上更喜欢它)。

我花了30分钟的谷歌search,但我终于发现它埋在W3规范。

混淆是因为规范中的头文件是HTTPS: 1 ,这就是Chromium如何实现的,但是在这之后, 很多网站的编码很糟糕 (特别是WordPress和WooCommerce),Chromium团队对此表示歉意:

“我为破坏道歉,我显然低估了开发和testing期间反馈的影响。”
– 麦克韦斯特 ,在Chrome问题501842

他们的修正是将其重命名为Upgrade-Insecure-Requests: 1 ,并且规范已经更新以匹配。

无论如何,这里是W3规范的解释(就像它当时出现的那样) …

HTTPS HTTP请求头字段向服务器发送一个信号, 表示客户端对encryption和authentication响应的偏好 ,并且可以成功处理upgrade-insecure-requests指令 ,以使该偏好尽可能无缝地提供。

当一个服务器在一个HTTP请求的头文件中遇到这个首选项时,它应该把用户redirect到被请求的资源的一个潜在的安全表示。

当服务器在HTTPS请求头中遇到这个首选项时,如果请求的主机是HSTS安全的或有条件的HSTS安全的[RFC6797],它应该在响应中包含一个Strict-Transport-Security头。

Interesting Posts