專案背景
專案中遇到罕見的故障現象,客戶生產環境中的Citrix ADC,系統版本為升級到12.1.60.16後,部分HTTP協定的VS會出現業務訪問失敗的情況。 |
經過排查
1、Citrix ADC的配置未發生改變,配置是基本的HTTP業務,並無其他高級功能;
2、Citrix ADC收到伺服器http request後主動發起reset給用戶端和伺服器;
3、HTTP業務中部分業務正常,部分受影響。
1.1 問題定位
初步定位,Citrix ADC在12.1的60版本後,啟用了更加嚴格的RFC7230策略。在RFC7230中規定

但是在12.1.57.18以前的版本中,允許上述這兩個欄位同時出現。這兩個欄位的同時出現,牽扯到一個技術名詞“HTTP Request Smuggling”。
1.2 如何解決該問題
* 建議使用者調整應用程式,使得Content-Length和Transfer-Encoding不會同時出現。
*通過Citrix ADC來解決,經測試方法有下列幾個可行:
– VS的協議類型由HTTP修改為TCP(如果使用了Content Switch則該方法不可用)
– 將Citrix ADC到後端伺服器Rewrite HTTP request version修改為HTTP/1.0(某些場景可能不適用)
– 版本降至12.1的57版本(建議方法)
1.3 如何判斷是否命中該故障
驗證是否命中本文中描述的雷區,通過以下幾方面來參考
2. 原理部分講解
2.1 [RFC7230](#_RFC7230)(點擊跳轉連結)
GITHUB中RFC7230對“Transfer-Encoding”和“Content-Length”的定義中有一句是發送者不得\在任何包含Transfer-Encoding頭欄位的消息中發送Content-Length頭欄位”。
2.2 [Content-Length](#_Content-Length)(點擊跳轉連結)
HTTP頭部Content-Length用於描述HTTP消息實體長度和傳輸長度,流覽器對比Content-Length和HTTP請求或者回應body長度判斷一次完整的HTTP傳輸過程。當請求某一個url時,伺服器已經知道了資源的大小,就會使用Content-Length來告訴流覽器,你請求url的body大小是多少,比如說body是1024B,流覽器傳輸1024B之後,本次任務就結束。通常伺服器已經資源的大小,一般是一些圖片,或者是靜態的腳本等。所以header中如果存在Content-Length,實體長度和傳輸長度不相等(比如說設置了Transfer-Encoding),那麼則不能設置Content-Length。如果設置了Transfer-Encoding,那麼Content-Length將被忽視”,可以理解為Transfer-Encoding的priority高於Content-Length(該說法在本文中的第四章節“Rewrite http request version”被證實)。
發表迴響