HTTP请求转发那些事:你可能不知道的Hop-by-hop Headers和End-to-end Headers
摘要:不是所有的web容器都能帮助开发者屏蔽hop-by-hop headers,有些容器反而允许开发者自定义hop-by-hop headers来实现更大程度的灵活性。
本文分享自华为云社区《HTTP请求转发那些事:你可能不知道的Hop-by-hop Headers和End-to-end Headers》,作者:蜉蝣与海。
引子
最近看到F5官方发布的公告,给出了一个身份验证绕过漏洞(CVE-2022-1388)的修复方案。这个漏洞允许攻击者发送一些未公开的请求,来绕过身份认证,进而控制系统。通过阅读官网的修复方案,发现这个漏洞的修复居然和http请求头的不当使用有关(如下图所示)。而在请求转发时如果没有妥善处理图中“Connection:close”这样的请求头,可能会导致请求频繁失败。今天就来简单聊聊容易让请求转发出问题的Hop-by-hop Headers。
请求转发中的http header
目前,微服务成为一种流行的webapp部署模式,部署时多个微服务之间难免进行数据交互。考虑下列请求转发场景,这里App A可能是一个自己编写的鉴权服务器或者代理服务器:
App A将一个请求,原封不动地转发给了App B,并且将App B的响应原封不动地返回给客户端。如果App A的代码或者web容器没有对App B的响应头做特殊处理,就容易出现上述情况:响应头中包含了两个key值一样的header:Connection:someValue。
由于响应头中Connection字段决定了http的长连接是否可用, 当样例中的两个Connection字段值不同时,客户端收到请求后无法明确辨析服务端对当前http连接的态度,会导致一些不可预知的情况。例如,如果valueA是“Close”,而valueB是“Keep-Alive”,这个时候客户端无法清晰的知道服务端是否会继续维系当前http连接。
在RFC 2612中,对响应头划分为了End-to-end Headers和Hop-by-hop Headers,Hop-by-hop Headers往往会影响客户端对http响应的连接维系、内容处理策略等,Connection字段就是RFC 2612所定义的一个Hop-by-hop Headers。
如图,RFC 2612给出了HTTP/1.1中的响应头,并解释Hop-by-hop Headers:Hop-by-hop Headers中的响应头,对一次连接有意义,然而,这些响应头不应该被缓存或者层层转发。反过来理解,也就是层层转发以上响应头,请求可能会出问题。
一个Transfer-Encoding被转发的例子
如图,当App B存在分块响应时,Transfer-Encoding响应头会提醒App A进行分块读取。具体来说,App B的响应体中包含了Transfer-Encoding:chunked,App A发现这个响应头后,在读取响应体时,会读取若干个响应分块,对每个分块,会先读取一个分块大小,而后读取分块。当App A将Transfer-Encoding:chunked携带回客户端时,客户端会试图按理解分块响应的操作对App A的响应进行读取,然而,使用curl会打印这样的信息,这说明App A没有对响应内容做了分块:
当App A和 App B的容器为tomcat或者spring boot时,容易复现此场景,App A使用jetty作为容器则不易复现此问题。这说明部分web容器对Hop-by-hop Headers的处理策略是不同的。
总结:
不是所有的web容器都能帮助开发者屏蔽hop-by-hop headers,有些容器反而允许开发者自定义hop-by-hop headers来实现更大程度的灵活性。
在处理请求转发场景时,开发者面对这样的header要分外小心,尽量显示使用或者显示屏蔽这些header,在更换web容器时需要进行必要的测试。
参考资料
[1]F5公告的漏洞:https://support.f5.com/csp/article/K23605346#proc3
[2]Abusing HTTP hop-by-hop request headers: https://nathandavison.com/blog/abusing-http-hop-by-hop-request-headers
[3]RFC 2612:https://datatracker.ietf.org/doc/html/rfc2616#section-13.5.1
HTTP请求转发那些事:你可能不知道的Hop-by-hop Headers和End-to-end Headers的更多相关文章
- 深入浅出Java 重定向和请求转发的区别
深入浅出Java 重定向和请求转发的区别 <span style="font-family:FangSong_GB2312;font-size:18px;">impor ...
- 【Servlet】深入浅出JavaServlet重定向和请求转发
import java.text.*; import java.util.*; import java.io.*; import javax.servlet.http.*; import javax. ...
- 你所不知道的html5与html中的那些事(五)——web图像
文章简介: 现在的页面,一般都离不开图像,而怎么做才能让我们的页面中的图像加载的又快又好呢?在优化页面速度的时候还有什么事是你所不知道的呢? 下面看看今天我为大家带来了哪些关于we ...
- 请求转发、包含、重定向 getAttribute 和 setAttribute POST和GET编码
一.请求转发 请求包含 请求重定向 Demo5.java 注意:doPost()方法中别忘写doGet(request, response); public void doGet(HttpS ...
- 用 IIS 实现请求转发
最近部门要开发一个简单的APP,部分数据是现有项目已经存在的,为了方便维护,希望只提供一个交互的入口,并且协议的规则不变. 基于这个需求,有两套解决方案: 1.用代码将现有的api封装一层,对请求数据 ...
- Java Web中请求转发和请求包含
1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...
- nginx实现请求转发
反向代理适用于很多场合,负载均衡是最普遍的用法. nginx 作为目前最流行的web服务器之一,可以很方便地实现反向代理. nginx 反向代理官方文档: NGINX REVERSE PROXY 当在 ...
- spring mvc 请求转发和重定向(转)
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现
SpringMVC完成初始化流程之后,就进入Servlet标准生命周期的第二个阶段,即“service”阶段.在“service”阶段中,每一次Http请求到来,容器都会启动一个请求线程,通过serv ...
- 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器
现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...
随机推荐
- 关于Xftp7和Xshell7是最新版本但是报错这件事
以win11为例,仅供参考.只能说捣鼓这么久还是建议各位转用MobaXterm. 先说一下,我的解决方法只能说是跳过问题,不是解决问题. <要继续使用此程序 您必须应用最新的更新或使用新版本&g ...
- Kafka 在分布式系统中的 7 大应用场景
Kafka 介绍 Kafka 是一个开源的分布式流式平台,它可以处理大量的实时数据,并提供高吞吐量,低延迟,高可靠性和高可扩展性.Kafka 的核心组件包括生产者(Producer),消费者(Cons ...
- windows上时间项目时间正常,Ubuntu16.04上时间错误
项目本次测试时间正常,放到服务器上时间差8个小时 1.查看Ubuntu系统时间,发现时间设置错误 date -R 该命令会把我们系统的时间还有时区显示出来,我们是属于东八区,如下图: 如果不是 +08 ...
- Python 利用pandas和matplotlib绘制柱状折线图
创建数据可视化图表:柱状图与折线图结合 在数据分析和展示中,经常需要将数据可视化呈现,以便更直观地理解数据背后的趋势和关联关系.本篇文章将介绍如何使用 Python 中的 Pandas 和 Matpl ...
- 最小生成树(Kruskal Prim)
最小生成树 (克鲁斯卡尔算法) Kruskal 给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数. 求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible. 给 ...
- 节能减排 | AIRIOT智慧工厂节能管理解决方案
工厂作为高能耗的生产型企业,降低能耗和提升资源利用率方面就显得很重要,对实施国家倡导的节能降耗.绿色发展有着很大程度上的必要性.然而,工厂能源管理从传统手段向智能化升级转型的过程中,企业也不可避免的面 ...
- 三菱PLC 轻松数采
目前市面上数采的软件有很多,但是用的最为省力最为简单的就是kepserver了,在kepserver的应用中,有对应的三菱驱动针对于三菱PLC,三菱驱动支持多个Mitsubishi 协议,包括 MEL ...
- 【JSOI2008】火星人 (哈希+Splay)
题目 这种含有修改操作的就难以用后缀数组实现了,求LCP这种区间相等的类型可以想到用hash判断,同时LCP的答案大小符合二分条件可以二分求出,如果只有修改可以用线段树维护,因为还有有插入操作所以想到 ...
- [计蒜客20191103B] 饮料
小 B 出门游玩,他现在走到了 \(n\) 家饮品店前,第 \(i\) 家买饮料的花费为$ cost_i$ ,他只能去花费不超过自己所带钱数额的店,但他现在不确定自己兜里有多少钱,所以现在给出 \(m ...
- isAlive
线程存活 当线程执行时显示线程存活 执行完毕为false