今天設計 短時間行為監控。目的是避免攻擊者在獲得 API Key 後,短時間內瘋狂觸發敏感的資料庫工具(如 query_database 或 delete_database),造成資料外洩或刪除。
在 MCP Server 的工具程式碼中,我新增了邏輯:
針對資料庫相關關鍵字(select, delete, update, insert…)做計數
記錄最近 60 秒的執行次數,當超過 3 次以上時,立即回傳「已鎖定」訊息,並進入 60 秒冷卻
def _check_rate_limit(tool: str) -> tuple[bool, str]:
global _db_action_logs, _last_lock_until
now = datetime.now()
# 如果還在鎖定時間內直接拒絕
if _last_lock_until and now < _last_lock_until:
return False, f"{tool} 已被鎖定,請稍後再試 (解鎖時間: {_last_lock_until.strftime('%H:%M:%S')})"
# 保留 60 秒內的紀錄
_db_action_logs = [t for t in _db_action_logs if (now - t).seconds < 60]
_db_action_logs.append(now)
# 如果超過閾值 → 啟動鎖定
if len(_db_action_logs) >= 3: # 閾值 60 秒內 3 次
_last_lock_until = now + timedelta(seconds=60)
_db_action_logs = []
return False, f"偵測到短時間過多資料庫操作,鎖定 60 秒 (到 {_last_lock_until.strftime('%H:%M:%S')})"
return True, "ok"
n8n Workflow 的最後,我加了一個 IF 判斷式:
如果後端回傳 alert: true 或帶有「鎖定」字樣,就直接將訊息寫入 Notion Page,留下安全紀錄
這樣一來,即使使用者在前端仍然嘗試呼叫工具,我也能在 Notion 日誌裡看到完整記錄,方便事後追查。
初始 Notion 狀態
嘗試多次觸發
Notion 結果
這套設計有兩層好處: