在設計移動端(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)
說明#
- Flask-Limiter 是一個非常方便的工具,可以幫助我們設置請求的速率限制。上面的程式碼設定了以下幾個限制:
- 每天最多 200 次請求
- 每小時最多 50 次請求
- 每分鐘最多 3 次請求
- 自定義限制:對 /slow 路由設置了每分鐘最多 5 次請求。
- 排除限制:/ping 路由則設置為不受限制,這可用於需要不斷檢查服務是否運行的情況。
結論#
透過對 HTTP 請求的 User Agent 進行檢查,確保只有合法的移動端設備可以發送請求,並利用 Flask-Limiter 設置合理的請求速率限制,可以有效地防止濫用和 DDoS 攻擊,提升伺服器的安全性和穩定性。
