快轉到主要內容
  1. Posts/

強化 Flask API 安全:User Agent 檢查與速率限制

Flask API安全 網路安全 Flask API User Agent Rate Limiting Flask-Limiter Security DDoS
目錄

在設計移動端(Mobile)API 時,確保安全性和防止濫用是十分重要的。以下是如何透過檢查 HTTP 請求的 User Agent 來確保請求來自合法的移動裝置,並且使用 Flask 限制訪問速率來避免過多的請求。

1. 檢查 HTTP 請求的 Header – User Agent
#

在伺服器端,我們可以檢查每個請求的 User Agent,以確保它來自合法的移動設備。這樣可以防止來自桌面或其他非移動設備的無效請求。

  • Google Chrome from Desktop:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
  • iOS Chrome:
Mozilla/5.0 (iPhone; CPU iPhone OS 13_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/78.0.3904.67 Mobile/15E148 Safari/604.1
  • Android Chrome:
Mozilla/5.0 (Linux; Android 5.1.1; m2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.116 Safari/537.36

根據這些 User Agent 字串,伺服器可以判斷是否為來自手機端的請求。如果不是,就可以拒絕該請求或忽略處理。

2. 使用 Flask 限制 API 訪問速度
#

為了防止濫用或 DDoS 攻擊,可以利用 Flask-Limiter 限制 API 的請求速率。每次請求超出設置的速率限制時,Flask 將返回錯誤,並拒絕該請求。

以下是使用 Flask 和 Flask-Limiter 限制訪問速率的範例:

from flask import Flask
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

# 初始化Flask應用和Flask-Limiter
app = Flask(__name__)
limiter = Limiter(
    app,
    key_func=get_remote_address,  # 根據訪問者的IP地址限制
    default_limits=["200 per day", "50 per hour", "3 per minute"]  # 設置默認速率限制
)

@app.route("/slow")
@limiter.limit("5/minute")  # 這個API有自定義速率限制
def slow():
    return "slow"

@app.route("/fast")  # 使用默認速率限制
def fast():
    return "fast"

@app.route("/ping")
@limiter.exempt  # 忽略此API的限制
def ping():
    return "PONG"

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000, debug=True)

說明
#

  1. Flask-Limiter 是一個非常方便的工具,可以幫助我們設置請求的速率限制。上面的程式碼設定了以下幾個限制:
  • 每天最多 200 次請求
  • 每小時最多 50 次請求
  • 每分鐘最多 3 次請求
  1. 自定義限制:對 /slow 路由設置了每分鐘最多 5 次請求。
  2. 排除限制:/ping 路由則設置為不受限制,這可用於需要不斷檢查服務是否運行的情況。

結論
#

透過對 HTTP 請求的 User Agent 進行檢查,確保只有合法的移動端設備可以發送請求,並利用 Flask-Limiter 設置合理的請求速率限制,可以有效地防止濫用和 DDoS 攻擊,提升伺服器的安全性和穩定性。

Ernie
作者
Ernie

相關文章

PyCharm打包Python程式成EXE教學
Python Python PyCharm PyInstaller 打包
使用PyCharm和PyInstaller將Python程式打包成可執行檔(.exe)的步驟教學。