Why MCP and ChatGPT Apps Use Double Iframes — Frédéric Barthelet, Alpic
三句話摘要
MCP應用在ChatGPT中使用雙層iFrame機制渲染第三方UI,以及這個設計的安全隔離原理和開發實務。 雙iFrame機制通過層級隔離和子域名分片,在保證安全邊界的前提下實現了第三方UI的安全集成,開發者需主動聲明CSP域名來配合這個設計。 CSP和Origin隔離的核心困境:直接在父層DOM中注入iFrame會共享origin,允許第三方應用存取ChatGPT的local storage和cookies,構成安全威脅;若放寬CSP政策則會被惡意腳本利用。
重點整理
重點- 1
CSP和Origin隔離的核心困境:直接在父層DOM中注入iFrame會共享origin,允許第三方應用存取ChatGPT的local storage和cookies,構成安全威脅;若放寬CSP政策則會被惡意腳本利用。
- 2
雙iFrame的層級隔離方案:第一層iFrame在ChatGPT允許的proxy域名(如openai-usercontent.com)執行通用加載器,第二層iFrame在不同子域名中以sourceDoc方式隔離實際應用內容,兩層結合実現安全邊界。
- 3
子域名隔離策略:每個應用分配獨立子域名(如app-abc123.openai-usercontent.com),確保各應用的local storage、cookies和其他origin相關API互不衝突或竊取。
- 4
CSP元數據聲明的實務重要性:開發者必須在MCP規格中聲明所有連接域名(connect-src)、腳本域名(script-src)等,否則應用在生產環境會因CSP阻擋而失效。
實用技巧與重點
乾貨- 相關域名/平台:openai-usercontent.com(OpenAI用戶內容proxy域名)、Skybridge(Alpic開源框架)
- CSP核心指令:frame-src(允許的iframe源)、script-src(允許的腳本源)、connect-src(允許的API連接)、image-src(允許的圖片源)
- iFrame關鍵屬性:src(加載外部URL)、srcdoc(直接注入HTML內容)、sandbox(限制權限),allow-same-origin(恢復origin共享)
- 安全機制:nonce(一次性簽名令牌)、null origin(空source)、subdomain routing
- 開發工具:Skybridge框架内的CSP Inspector(自動檢測元數據缺失的域名)
- 歷史參考:Facebook應用市場(2010年代首次實現此模式)
結論
結論“雙iFrame機制通過層級隔離和子域名分片,在保證安全邊界的前提下實現了第三方UI的安全集成,開發者需主動聲明CSP域名來配合這個設計。”
完整解析
詳細在MCP應用生態中引入第三方UI到ChatGPT對話介面時,面臨一個根本的安全與功能張力。ChatGPT本身通過Content Security Policy(CSP)嚴格控制所有腳本執行——每個腳本必須攜帶每次請求動態生成的nonce簽名才能執行,這保護了用戶數據,但也意味著任意第三方代碼無法直接運行。
講者Fred首先解釋了直覺但失敗的方案:若使用iFrame的srcdoc屬性直接注入應用HTML,這個iFrame會自動共享父層的origin和CSP政策,導致第三方腳本被完全阻擋。如果為了讓app運行而放寬ChatGPT的CSP,則opens出另一個漏洞——app可以存取ChatGPT的local storage和cookies,竊取用戶認證令牌或隱私數據。試圖用sandbox屬性隔離origin也行不通,因為sandboxed iFrame會喪失所有origin相關功能(local storage、cookies、indexedDB),除非加上allow-same-origin才能恢復,而那又回到原問題。
雙iFrame機制是對這個困境的優雅解答,也是Facebook應用市場時代就採用的經典模式。架構分兩層:第一層iFrame由OpenAI控制,運行在允許列表域名openai-usercontent.com上,包含一個通用的script加載器,職責是下載並解析MCP服務器提供的應用資源;第二層iFrame則由這個加載器在不同子域名(app-abc123.openai-usercontent.com、app-xyz789.openai-usercontent.com等)上動態創建,使用srcdoc直接注入應用HTML。關鍵在於,雖然第二層iFrame仍然共享origin,但因為每個應用在獨立子域名上運行,它們的local storage、cookies等origin相關資源完全隔離——app-abc123無法讀取app-xyz789的資料。
開發者端的職責是在MCP應用元數據中聲明所有依賴域名。框架如Skybridge提供CSP Inspector工具,在開發環境自動追蹤應用實際發起的所有HTTP請求,並比對元數據中聲明的域名列表,即時提示遺漏項。這解決了歷史上大量應用因CSP遺漏在提交store後才被拒或在生產環境無法運行的問題。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

