MCP 寫入 Cloudflare WAF 觸發詞避開
問題
透過 Claude Code CLI 使用雲端 MCP(Box、ClickUp、Notion、Confluence)寫入內容時,Cloudflare WAF 會將特定字串當作攻擊特徵,直接封鎖整個 POST 請求(回傳 Cloudflare 403 頁面)。
讀取操作(GET)不受影響,只有寫入操作(POST with body)會被攔截。
觸發字串與 WAF 分類
| 原始字串 | WAF 判定類別 | 替代寫法 |
|---|---|---|
/etc/hosts | 路徑穿越 (Path Traversal) | 「系統 hosts 檔案」 |
0.0.0.0 | IP 位址注入 | 省略或用「loopback 位址」描述 |
sudo bash | 指令注入 (Command Injection) | 「以管理員權限執行腳本」 |
defaults write | 系統指令注入 | 「SoftwareUpdate 偏好設定」 |
/var/db/diagnostics | 路徑穿越 | 「系統診斷目錄」 |
/Library/LaunchDaemons/ | 路徑穿越 | 「系統級 Launch Daemon」 |
影響範圍
- 受影響:Claude Code CLI → anthropic.com MCP proxy → 各平台 API(所有
mcp__claude_ai_*工具的寫入操作) - 不受影響:
- 本地 MCP(如 Obsidian stdio 直連)— 不經過 Cloudflare
- Claude.ai web 版 — 走不同的請求路徑
- 雲端 MCP 的讀取操作(GET 請求)
實際案例
2026-03-25 存 KB 筆記「macOS 15.7.5 封鎖 Tahoe 升級方案」時:
- 五平台並行寫入,Obsidian 成功,其餘四個全部被 Cloudflare 封鎖
- 重試多次、重新認證 MCP server 均無效
- 排查後發現內容中包含
/etc/hosts、0.0.0.0、sudo bash、defaults write等字串 - 將敏感字串替換為描述性文字後,四個平台全部寫入成功
處理原則
- Obsidian(本地 stdio):保留完整原始內容,不需替換
- 雲端平台(Box、ClickUp、Notion、Confluence):將觸發字串替換為描述性文字
- 技術細節盡量用自然語言描述,避免直接貼命令列語法
- 如果不確定是否會觸發,先寫 Obsidian,再用替代版寫雲端平台