什麼是HTML 實體編碼/解碼器?

HTML 實體編碼/解碼器可將 <、>、& 及引號等特殊字元與其 HTML 實體表示(如 &lt;、&gt;)相互轉換,有效防止在 HTML 中嵌入使用者內容時產生 XSS 漏洞,並解決特殊字元的顯示異常問題。

編碼器將 <, >, &, ", ' 等字元以及任何 Unicode 碼點轉換為具名實體(&amp;, &lt;)、十進位數字參照(&#38;)或十六進位數字參照(&#x26;)。範圍選擇器可只編碼五個保留字元、所有特殊字元,或每個非 ASCII 字元。解碼可還原三種格式中的任何一種。適合在輸出 HTML 前淨化使用者輸入,或從 HTML 信件匯出中還原文字。

使用方法

  1. 步驟一 — 貼上含有特殊字元或 HTML 實體的文字。
  2. 步驟二 — 選擇「編碼」將字元轉換為實體,或選擇「解碼」將實體還原為字元。
  3. 步驟 3 — 選擇格式(具名、十進位或十六進位)與範圍以控制編碼強度。

何時使用

  • 把程式碼範例貼到 CMS,避免 < 和 > 被當成 HTML 標籤而消失。
  • 整理從 HTML 郵件或網頁抓取下來、還留著 &mdash;、&nbsp; 的內容。
  • 在伺服器端模板輸出使用者輸入前先轉義,阻擋 XSS 注入。

結果

您需要在 HTML 段落中展示程式碼片段 <div class=hero>,對其進行編碼後得到 &lt;div class=&quot;hero&quot;&gt;,本機將以文字形式呈現,而不會將其解析為 HTML 標籤。

常見問題

命名實體和數字實體有什麼差別?
命名實體是可讀的縮寫,例如 &copy; 代表 ©。數字實體用 Unicode 碼點表示,例如 &#169; 或十六進位 &#xA9;。數字實體可涵蓋所有 Unicode 字元;命名實體只包含 HTML5 規範定義的約 250 個字。
是不是每個特殊字元都要編碼?
在 HTML 內文中只需編碼 & < > 以及屬性值使用的引號。在 JavaScript 或 URL 情境下規則不同。範圍選擇器提供三種選項:僅保留字元 — 針對五個 XSS 關鍵字元,所有特殊字元 — 在保留字元之外加入排版符號,所有非 ASCII — 提供最廣泛的涵蓋。
編碼後會影響複製貼上或螢幕閱讀器嗎?
不會。瀏覽器在渲染前會先把實體解碼,使用者看到、複製到的都是原始字元。螢幕閱讀器拿到的同樣是解碼後的文字。實體只是傳輸時的標記形式,不是最終呈現。
只做 HTML 實體編碼能擋住 XSS 嗎?
對 HTML 內文夠用。放在屬性內還要把屬性加引號並編碼該引號字元。JavaScript、CSS、URL 等上下文各有自己的轉義規則,編碼只是第一層,不是全部。
為什麼有些實體寫 &#x、有些只寫 &#?
&#x 後面接十六進位碼點,&# 後面是十進位。兩者指同一字元,例如 &#xA9; 和 &#169; 都顯示為 ©。十六進位對應 Unicode 表的 U+ 表示法,高位碼點寫起來更短。

相關工具