產品面試:是否應該採用 HTML Sanitizer API 建立富文字編輯器?
題目與使用場景
SaaS 產品準備支援評論、知識庫與範本中的使用者富文字。團隊希望採用瀏覽器原生 HTML Sanitizer API,減少自維護過濾規則,但該 API 在部分主流瀏覽器仍不可用。請決定是否採用,並說明安全、體驗、相容與營運取捨。
面試官考察什麼
- 是否先定義威脅模型、允許的內容能力與伺服器信任邊界。
- 能否區分
setHTML()、自訂 Sanitizer、setHTMLUnsafe()與 Trusted Types 的職責。 - 是否把瀏覽器覆蓋、降級實作、內容一致性與遷移成本量化。
- 能否用分階段指標驗證 XSS 風險、編輯成功率、效能與回復能力。
作答前的釐清問題
先確認富文字是否需要連結、圖片、表格、嵌入、樣式與自訂屬性;確認內容是否會被伺服器渲染、郵件匯出、搜尋索引或多端重用。再確認支援的瀏覽器、現有過濾庫、合規要求、攻擊面與可接受的功能降級。
30 秒回答框架
我會採用「原生 API 優先、伺服器持續驗證、能力分級降級」的方案,而不是一次替換現有過濾器。原生 setHTML() 可依規範移除腳本能力標記,但 API 覆蓋有限;不支援時使用經稽核的同等策略。先在評論等低複雜場景灰度,指標包括危險載荷攔截、內容保真、編輯成功率、渲染效能與瀏覽器分布。伺服器仍需獨立清洗與輸出編碼,Trusted Types 作為注入匯點的額外約束。
分步驟深入解答
1. 定義使用者價值與威脅模型
使用者價值是更穩定地發佈可格式化內容;主要風險是把不可信 HTML 送入 DOM 或其他渲染匯點。先建立允許元素、屬性、連結協定與媒體來源清單,再決定哪些功能值得承擔維護成本。
2. 區分原生 API 的能力
Element.setHTML() 和 Document.parseHTML() 使用安全預設清理;自訂設定可收緊允許清單。setHTMLUnsafe() 適合需要保留特殊結構的場景,但必須配合嚴格設定與稽核。規範要求安全方法不能保留腳本能力標記,不能把 API 當作任意 HTML 的通行證。
3. 評估覆蓋與降級
MDN 將 HTML Sanitizer API 標為 Limited availability。透過能力偵測選擇原生路徑或伺服器/成熟函式庫路徑,並讓兩條路徑共享允許清單、測試樣例與版本記錄。降級時寧可丟棄高風險能力,也不要為了視覺一致放寬策略。
4. 設計跨端內容契約
伺服器保存原始輸入與規範化後的安全表示,明確哪個表示用於編輯、預覽、郵件、搜尋與匯出。伺服器在每個輸出邊界重新驗證,客戶端清理只降低 DOM 注入風險,不能取代伺服器授權、儲存與渲染策略。
5. 設計灰度與指標
先在單一內容類型與少量租戶開啟,比較原生與降級路徑的攔截結果。核心指標包括危險內容攔截率、誤刪申訴率、編輯提交成功率、首屏與輸入延遲、瀏覽器覆蓋、策略版本一致性與安全事件數。
6. 處理 Trusted Types 與營運流程
對高風險注入匯點啟用 Trusted Types 報告或強制模式,要求策略函式輸出經驗證的型別。建立規則變更審批、惡意樣本回歸、內容重處理與緊急回復流程;不要只依賴瀏覽器更新來改變安全策略。
高品質示範回答
我會先把決策拆成內容能力、威脅模型與執行環境三張表。HTML Sanitizer API 適合在瀏覽器側把不可信 HTML 送入 DOM 前做結構化清理,setHTML() 的安全預設值與 WHATWG 規範降低腳本能力標記被保留的風險,但 MDN 仍標記其覆蓋有限。產品方案採用原生 API 優先、成熟函式庫或伺服器策略降級;兩條路徑共享允許元素、屬性、協定與測試樣例。伺服器保存原始內容與安全表示,在頁面、郵件、搜尋與匯出邊界分別驗證,客戶端清理不承擔權限或完整 XSS 防護。先灰度評論場景,依危險載荷攔截、內容保真、提交成功率、效能、瀏覽器分布與安全事件評估。setHTMLUnsafe() 只在確有結構需求時使用,並配合嚴格設定、Trusted Types 與人工稽核。規則升級可回放歷史惡意樣本,發現回歸時立即切回上一版策略。
常見錯誤
- 因為是瀏覽器原生 API 就認為伺服器無需清理。
- 只看功能示範,不測試不支援瀏覽器和降級路徑的一致性。
- 為保留任意嵌入而放寬
setHTMLUnsafe()設定。 - 用單一「過濾成功率」替代內容保真、誤刪與安全事件指標。
- 把 Trusted Types 當作清理器,或把清理器當作權限控制。
延伸追問與參考答案
為什麼不直接全面切換原生 API?
瀏覽器覆蓋、內容能力與舊資料遷移仍有不確定性。先灰度並保持可回復的降級路徑,才能驗證真實瀏覽器與內容分布。
如何處理原生 API 與伺服器規則不一致?
共享版本化允許清單與惡意樣本,伺服器作為最終邊界;客戶端發現差異時記錄策略版本與內容樣本,禁止靜默放寬規則。
何時值得開啟 Trusted Types 強制模式?
當主要注入匯點已盤點、策略函式與第三方元件完成改造,並在報告模式觀察到低誤報後,再逐步切換強制模式。