輸出編碼

HTML 跳脫:依輸出情境正確編碼

HTML 字元參照可表示 & 與角括號等語法敏感字元,但只有符合實際輸出情境時才有效。編碼不會移除惡意語意、不會驗證 URL,也不等於清理 HTML。

在 HTML 輸出邊界編碼資料

將不可信資料插入 HTML 文字時,至少要編碼 &、< 與 >。本工具預設也編碼兩種引號,因此結果可作為文字,或放入已正確加上引號的 HTML 屬性值。外層引號不能省略,未加引號屬性有不同解析規則。

不要編碼整份 template 或可信任標記。現代框架通常已會跳脫插入的文字;若先手動編碼再交給框架,第二層編碼可能讓頁面顯示 &amp; 等字樣。

輸出情境改變時,編碼方式也要改

HTML 編碼不適用於 JavaScript、CSS、事件處理屬性或 URL。應使用該情境專用的 framework 或 API。URL 屬性還要檢查允許的 scheme 與目的地;把 javascript:alert(1) 編碼後仍不是安全 URL。

若刻意允許使用者提供 HTML,應使用持續維護、具明確 allowlist 的 HTML sanitizer。本工具把解碼結果當成文字放入 textarea,從不當成可執行標記插入頁面。

一次只解碼一層,再檢查出現的內容

解碼器依瀏覽器 HTML parser 處理具名、十進位與十六進位字元參照;未知參照維持原樣。每次只解碼一層:&amp;lt; 會變成 &lt;,不會直接變成 <。重複解碼可能意外還原語法,也是常見的過濾繞過來源。

選用的非 ASCII 模式會把每個 Unicode code point 轉成十進位字元參照;emoji 等補充平面字元仍視為一個 code point。UTF-8 HTML 通常不需要這麼做,且可讀性較差,只有接收系統明確要求 ASCII-only 原始碼時才使用。

結果留在本機,並維持明確上限

輸入與結果只留在此瀏覽器,不會儲存或放進網址。工具最多接受 1 MiB UTF-8 輸入,輸出超過 8 MiB 前會停止。編輯、交換或清除內容都會使舊結果失效。

編碼或解碼成功只代表轉換完成。上線前仍要檢查最終 template、屬性引號、URL 政策、framework 行為與瀏覽器實際渲染。

<p title="Tom &amp; Jerry">&lt;strong&gt;你好&lt;/strong&gt;</p>

資料可信度

資料來源