摘要:不是所有的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的更多相关文章

  1. 深入浅出Java 重定向和请求转发的区别

    深入浅出Java 重定向和请求转发的区别 <span style="font-family:FangSong_GB2312;font-size:18px;">impor ...

  2. 【Servlet】深入浅出JavaServlet重定向和请求转发

    import java.text.*; import java.util.*; import java.io.*; import javax.servlet.http.*; import javax. ...

  3. 你所不知道的html5与html中的那些事(五)——web图像

    文章简介:       现在的页面,一般都离不开图像,而怎么做才能让我们的页面中的图像加载的又快又好呢?在优化页面速度的时候还有什么事是你所不知道的呢?     下面看看今天我为大家带来了哪些关于we ...

  4. 请求转发、包含、重定向 getAttribute 和 setAttribute POST和GET编码

     一.请求转发  请求包含  请求重定向 Demo5.java   注意:doPost()方法中别忘写doGet(request, response); public void doGet(HttpS ...

  5. 用 IIS 实现请求转发

    最近部门要开发一个简单的APP,部分数据是现有项目已经存在的,为了方便维护,希望只提供一个交互的入口,并且协议的规则不变. 基于这个需求,有两套解决方案: 1.用代码将现有的api封装一层,对请求数据 ...

  6. Java Web中请求转发和请求包含

    1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...

  7. nginx实现请求转发

    反向代理适用于很多场合,负载均衡是最普遍的用法. nginx 作为目前最流行的web服务器之一,可以很方便地实现反向代理. nginx 反向代理官方文档: NGINX REVERSE PROXY 当在 ...

  8. spring mvc 请求转发和重定向(转)

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  9. SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现

    SpringMVC完成初始化流程之后,就进入Servlet标准生命周期的第二个阶段,即“service”阶段.在“service”阶段中,每一次Http请求到来,容器都会启动一个请求线程,通过serv ...

  10. 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器

    现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...

随机推荐

  1. 虹科分享 | B站崩了怎么办?Redis企业版数据库多云战略分析

    近日,拥有3.33亿月均活用户的中国最大青年社区-B站因大规模服务器宕机,再度喜提热搜.对于B站这样需要满足大量用户在同一时间进行访问并实现各种功能的大型平台,其后台架构是十分复杂和庞大的.本地服务器 ...

  2. Nginx-多功能脚本

    #!/bin/bash #2020年2月16日 #auto_install_nginx_web.v3 #by fly ################################ #NGX_VER ...

  3. 关于虚拟机的IP地址经常改变问题的解法

    主要解法就是配置静态IP地址 首先了解一下IP和子网掩码,网关的含义:IP 是标识计算机特定地址的二进制数,子网掩码用于和IP组合划分子网;网关是将信息传送到网关进行收发 开始配置:首先打开Linux ...

  4. React 基础介绍以及demo实践

    这篇文章是之前给新同事培训react基础所写的文章,现贴这里供大家参考: 1.什么是React? React 是一个用于构建用户界面的JavaScript库核心专注于视图,目的实现组件化开发 2.组件 ...

  5. Qt+FFmpeg播放mp4文件视频

    关键词:Qt FFmpeg C++ MP4 视频 源码下载在系列原文地址. 先看效果. 这是一个很简单的mp4文件播放demo,为了简化,没有加入音频数据解析,即只有图像没有声音. 音视频源的播放可以 ...

  6. Java 21增强对Emoji表情符号的处理了

    现一个 Java 21 中有意思的东西! 在java.Lang.Character类中增加了用于确定字符是否为 Emoji 表情符号的 API,主要包含下面六个新的静态方法: public stati ...

  7. vue+element-ui小笔记

    1.图片加载失败,给默认图 2.form表单中,输入框加回车事件,页面刷新,如何解决? 3.使用在线主题生成工具,修改element自定义主题色 1.图片加载失败,给默认图,两种解决方法: 方法一: ...

  8. 【Java】Java中StringBuilder()成员方法append()和toString()

    StringBuilder就相当于C++的String长度可变,用于构造字符串对象,内部使用自动扩容的数组操作字符串数据. StringBuilder和StringBuffer使用的是相同的API[区 ...

  9. Android学习day03【跑马灯】

    这个学习内容很简单,说一下自己笨蛋的点吧 要实现这种情况,我始终没有办法实现(也就是跑马灯,图片没办法显示) 后来发现 android:layout_width="wrap_content& ...

  10. 给 Web 前端工程师看的用 Rust 开发 wasm 组件实战

    什么是wasm组件? wasm 全称 WebAssembly,是通过虚拟机的方式,可以在服务端.客户端如浏览器等环境执行的二进制程序.他有速度快.效率高.可移植的特点. 对我们 Web 前端工程最大的 ...