1. 程式人生 > 實用技巧 >Http 慢速攻擊問題修復記錄

Http 慢速攻擊問題修復記錄

Http 慢速攻擊定義

HTTP 慢速攻擊也叫 slow http attack,是一種 DoS 攻擊的方式。由於 HTTP 請求底層使用 TCP 網路連線進行會話,因此如果中介軟體對會話超時時間設定不合理,並且HTTP在傳送請求的時候採用慢速發 HTTP 請求,就會導致佔用一個 HTTP 連線會話。如果傳送大量慢速的 HTTP 包就會導致拒絕服務攻擊DoS。

三種攻擊方式

  1. Slow headers (也稱 slowloris):Web 應用在處理 HTTP 請求之前都要先接收完所有的 HTTP 頭部,Web 伺服器再沒接收到 2 個連續的 \r\n 時,會認為客戶端沒有傳送完頭部,而持續的等等客戶端傳送資料,消耗伺服器的連線和記憶體資源。

  2. Slow body (也稱 Slow HTTP POST):攻擊者傳送一個 HTTP POST 請求,該請求的 Content-Length 頭部值很大,使得 Web 伺服器或代理認為客戶端要傳送很大的資料。伺服器會保持連線準備接收資料,但攻擊客戶端每次只發送很少量的資料,使該連線一直保持存活,消耗伺服器的連線和記憶體資源。

  3. Slow read (也稱 Slow Read attack):客戶端與伺服器建立連線併發送了一個 HTTP 請求,客戶端傳送完整的請求給伺服器端,然後一直保持這個連線,以很低的速度讀取 Response,比如很長一段時間客戶端不讀取任何資料,通過傳送 Zero Window 到伺服器,讓伺服器誤以為客戶端很忙,直到連線快超時前才讀取一個位元組,以消耗伺服器的連線和記憶體資源。

解決方案

1. SpringBoot

springboot 配置檔案中新增如下配置:

server.connection-timeout=20000

2. Tomcat

tomcat 配置檔案 server.xml 中修改 Connector 中的 connectiontimeout 的值:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

3. Nginx

nginx 上可以增加如下配置來解決此問題:

# 指定客戶端與服務端建立連線後傳送 request body 的超時時間,配置段:http,server,location
client_body_timeout 20s;

# 指定客戶端向服務端傳送一個完整的 request header 的超時時間,配置段:http,server,location
client_header_timeout 10s;

# 服務端向客戶端傳輸資料的超時時間,配置段:http,server,location
send_timeout 30s;

測試

使用 slowhttptest 測試,具體測試方式可以參照下面的參考連結。

這裡主要說一下測試結果的驗證,slowhttptest 測試過程中會顯示如下圖的執行結果:

這裡主要看兩行:

  1. 最後一行的 service available 是否始終處於 Yes 狀態,也就是服務正常訪問狀態
  2. 觀察第一行中的數值(即測試時間),測試連線是否在超過之前配置的超時時間之後結束。

如果 slowhttptest 執行期間,服務始終正常訪問,訪問超時之後就結束,則證明配置生效。

參考來源

https://blog.csdn.net/weixin_39934520/article/details/107707268
https://www.cnblogs.com/endust/p/11960901.html
https://www.cnblogs.com/52py/p/10931089.html