协议走私回顾:笔者之前曾做过简单尝试。后发现python的一些框架都对其做了防御性代码。
那Nginx是否有相关代码进行预防呢,笔者结合gpt对源码进行了一些分析。
结论是nginx是有预防性代码的。对于ct和te同时存在时,只会处理te;同时存在多个ct或者te时,会直接返回400错误。
下面时结合nginx源码的一些分析
- 处理CT和TE同时存在的情况
Nginx官方从stable-1.4开始就已经对请求头中的协议走私问题进行了代码防御
核心源码均在src/http/ngx_http_request.c 文件中
image.png
和stable-1.2进行对比
image.png
通过官方changelog可以观察到从2013年4月份开始发布的版本就有针对协议走私的防御性代码的。
image.png
以Stable-1.8核心代码举例来阅读下这段防御性代码的意思
image.png
- 处理同时存在多个CT或者TE的情况从Stable-0.5版本开始,Nginx源码就针对某些特别的请求头参数进行了唯一性校验。
image.png
从stable-1.18开始,对CT和TE都做了唯一性校验
image.png
关于这段函数的解释
image.png
image.png
也就是说针对这几个请求头可能存在的参数,不允许重复。否则直接返回400协议违背。我们做几个简单的测试。
image.png
以IF-NONE-MATCH为例,一个的情况下是正常的。
image.png
请求头再加一个相同的参数就报协议违背错误。
image.png
用IF-RANGE测试也是相同的情况。
image.png