通过企业服务治理中心调用第三方接口差点造成http请求走私攻击

http和tcp的关系

1、由七层网络模型来看,tcp位于传输层,而http位于应用层。

2、http是建立在TCP连接上的,在老版本的http中,一次http请求就会建立一次TCP连接,http请求完成之后会断开tcp连接,也被称为短连接,但是随着互联网的发展,短连接请求的方式开销大,效率不高,所以在新版本的http中会复用一个tcp连接,减少了频繁的TCP连接打开和关闭带来的消耗。

http报文格式

1、起始行

起到对报文进行描述的作用,位于报文的第一行,请求报文和响应报文的起始行格式有所不同,请求报文的起始行的格式一般为:<方法><请求路径><版本>,响应报文的起始行格式一般为:<版本><状态><原因短语>。

2、请求头

首部是可有可无的,存在的情况下,起始行后面的就是首部数据,每个首部都有一个名字,有特定含义的约定好的首部,也可以进行自行定义,每一行由名字后面跟着一个冒号:  ,然后就是首部的值,就像键值对一样的。比如一些常见的Content-Length(请求体数据长度),Content-Type(请求体数据类型),Connection(链接是否要关闭,如果为close,则表示关闭tcp连接,如果为Keep-Alive,则表示复用tcp连接)

3、请求体

请求体数据也是可有可无的,存在的情况下可以包含任务数据组成的数据块,具体的类型和长度在请求头中的Content-Length(请求体数据长度),Content-Type(请求体数据类型)这两个体现出来。

网络请求走私

一般大型企业的网络架构,应用网络都是比较复杂,有时候从安全角度来看,各个环境需要隔离,但是业务需求往往又要要求打通各个隔离环境网络,以便实现数据传输,这时候使用的服务器和代理服务器往往也是雨露均沾,在这样复杂的网络环境下使用不同的代理服务器进行数据的传输,由于现在的服务器对网络协议的实现程度不同,导致请求转发的时候可能会造成数据的错乱,而导致请求失败,严重的话会产生安全风险。

血案

我们的应用和第三方的应用服务接入企业服务治理中心进行统一的API管理,对方的服务还用一个haproxy进行负载转发。整体如下图

通过企业服务治理中心调用第三方接口差点造成http请求走私攻击_第1张图片

在一个业务场景中,需要先调用一个get请求,然后再调用post请求来完成。

测试验证上生产跑了一段时间之后,会发现每隔半小时会有一个请求失败,经过抓包分析和review代码得出结果,由于get请求带了请求体{},一个空的json,请求的长度为2,但实际上是不需要的(代码用了治理中的封装好的API,但是说明稳定老旧,维护不及时,方法说明不清晰,在调用get请求的时候,构建请求体数据的时候new了一个空的map对象放进去,其实可以为null的),有时候get请求的请求体数据会丢失掉,然后复用tcp连接,那么这个get请求就会读取 接下来的post请求体的 两个字符,导致post请求数据不一致,从而失败。好在加了失败重试机制,从而保证了业务没有收到影响。

原因:1、网络复杂,代理服务器各不相同,2、治理中心没有清晰的说明文档

 

 

 

 

你可能感兴趣的:(http,java,http,网络)