Http 慢速攻擊定義
HTTP 慢速攻擊也叫 slow http attack,是一種 DoS 攻擊的方式。由於 HTTP 請求底層使用 TCP 網絡連接進行會話,因此如果中間件對會話超時時間設置不合理,並且HTTP在發送請求的時候采用慢速發 HTTP 請求,就會導致占用一個 HTTP 連接會話。如果發送大量慢速的 HTTP 包就會導致拒絕服務攻擊DoS。
三種攻擊方式
-
Slow headers (也稱 slowloris):Web 應用在處理 HTTP 請求之前都要先接收完所有的 HTTP 頭部,Web 服務器再沒接收到 2 個連續的
\r\n
時,會認為客戶端沒有發送完頭部,而持續的等等客戶端發送數據,消耗服務器的連接和內存資源。 -
Slow body (也稱 Slow HTTP POST):攻擊者發送一個 HTTP POST 請求,該請求的 Content-Length 頭部值很大,使得 Web 服務器或代理認為客戶端要發送很大的數據。服務器會保持連接准備接收數據,但攻擊客戶端每次只發送很少量的數據,使該連接一直保持存活,消耗服務器的連接和內存資源。
-
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 測試過程中會顯示如下圖的執行結果:
這里主要看兩行:
- 最后一行的
service available
是否始終處於Yes
狀態,也就是服務正常訪問狀態 - 觀察第一行中的數值(即測試時間),測試連接是否在超過之前配置的超時時間之后結束。
如果 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