HTML 轉義/反轉義

將 &、<、>、"、' 等特殊字元轉換為 HTML 實體(轉義),或將實體還原為原始字元(反轉義)。適用於防範 XSS 攻擊及在 HTML 中嵌入文本。

常用命名 HTML 實體一覽

字元 命名實體 數字字元引用 說明
& &amp; &#38; 和號(表示"and"的符號)
< &lt; &#60; 小於號(與 HTML 標籤的起始字元相同)
> &gt; &#62; 大於號(與 HTML 標籤的結束字元相同)
" &quot; &#34; 雙引號(屬性值的分隔符)
' &apos; &#39; 單引號(屬性值的分隔符)
  &nbsp; &#160; 不換行空格(不會觸發換行的空白字元)
© &copy; &#169; 版權符號
® &reg; &#174; 註冊商標符號
&trade; &#8482; 商標符號
&euro; &#8364; 歐元符號
¥ &yen; &#165; 日元符號
¢ &cent; &#162; 美分符號

什麼是 HTML 跳脫

HTML 跳脫是把 &<>"' 這五個特殊字元,轉換為瀏覽器不會當作語法解析的其他表記(HTML 實體)的處理。若把使用者輸入的字串原樣嵌入 HTML,<> 會被誤認為標籤的開始與結束而導致排版錯亂,還可能引發 <script> 之類惡意程式碼被執行的 XSS(跨站腳本)。HTML 跳脫正是防範該風險的基本對策。

反跳脫則相反,是把 &amp; 之類具名實體或 &#38; 之類數值字元參照還原為原本字元的處理。適用於從其他網站複製 HTML 原始碼時,或查看 CMS、討論區的發文資料時,希望把以實體表記難以閱讀的原文還原出來的場合。轉換僅由瀏覽器內的 JavaScript 完成,輸入內容不會傳送至外部。

HTML 跳脫的使用方式

  1. 選擇模式 若想把字元轉換為實體請選擇「跳脫」,若想把實體還原為原本字元請選擇「反跳脫」。
  2. 把文字貼到輸入欄 把想嵌入 HTML 的字串,或含有實體表記的字串貼到輸入欄。
  3. 確認轉換結果 輸入的同時會即時反映到下方的轉換結果欄。重新編輯輸入則每次都會重新計算。
  4. 複製結果 可用「複製」按鈕把轉換結果送入剪貼簿,直接貼到 CMS 內文或原始碼中。

用好本工具的小技巧

  • HTML 轉義是防範 XSS(跨站指令碼攻擊)的基礎手段。在將使用者輸入嵌入 HTML 之前,務必先進行轉義處理。
  • & 必須最先轉義。如果先轉換其他字元,新生成的 &amp; 中的 & 會被再次轉義,造成重複轉義。
  • 在屬性值中嵌入字串時,除了 "(雙引號)外,最好連 '(單引號)也一併轉義,這樣更安全。
  • 本工具支援將十進位制數字引用&#38;)、十六進位制數字引用&#x26;)以及常用命名實體(如 &amp;)反轉義還原。
  • 許多模板引擎(Blade、JSX、Vue 等)在插入變數時會自動進行 HTML 轉義,但如果使用 {!! !!} 或 v-html 這類"原始 HTML 輸出"語法,就需要自行手動轉義。

HTML 跳脫的應用情境

在 CMS、部落格文章中嵌入引用

在內文中刊載程式碼或其他網站的引文時,若把含 <> 的字串原樣貼上,會被誤認為標籤而導致顯示錯亂。事先跳脫後再貼上即可安全顯示。

確認討論區、留言區的發文內容

想查看以實體表記原樣保存在討論區或留言區資料庫中的發文時,可用反跳脫還原為原文以便閱讀。

在 Markdown 中嵌入 HTML 片段

若想在 Markdown 文件中原樣顯示 HTML 標籤的範例或範例程式碼,事先跳脫即可避免被 Markdown 剖析器或瀏覽器當作標籤解析,從而以字串形式顯示。

HTML 樣板的除錯

在樣板引擎輸出的 HTML 原始碼中尋找意外被跳脫(或遺漏跳脫)之處時,也可用於對照轉換前後的字串。

用語集

HTML 實體(字元實體參照)
在 HTML 文件中安全顯示具有特殊含義之字元的表記法。具名形式以「&」開頭、以「;」結尾,如 &amp;
數值字元參照
以 Unicode 碼位編號指定字元的表記法。十進位寫作 &#38;,十六進位寫作 &#x26;,兩者表示同一字元。
XSS(跨站腳本)
使用者輸入中所含腳本未經跳脫即被嵌入頁面,從而在其他使用者瀏覽器中執行非預期程式碼的漏洞。HTML 跳脫是代表性的對策之一。
淨化(sanitize)
泛指從外部接收的資料中去除危險要素、或將其轉換為無害形式的處理。HTML 跳脫是淨化的一種。
&(和號)的跳脫
跳脫處理中應最先轉換的字元。若先轉換其他字元,產生的 &amp; 等中的 & 也會被二次跳脫,因此處理順序至關重要。
屬性值的分隔符號
指包裹 HTML 標籤屬性值的 "(雙引號)或 '(單引號)。屬性值中若含這些字元而不跳脫,便會被誤認為屬性的分隔。

常見問題

&lt;&gt;&amp; 這三個字元會被 HTML 解析器當作語法的一部分來解釋。如果忘記轉義,瀏覽器可能會誤認為是標籤的開始或結束,從而導致頁面佈局錯亂,甚至引發XSS(惡意指令碼注入)攻擊。

URL 編碼(百分號編碼)用於在 URL 中安全地表示特殊字元,而 HTML 轉義則是為了防止字元在 HTML 文件中被誤認為標籤。兩者用途不同,如果表單的值既要作為 URL 引數又要顯示在 HTML 中,有時需要同時進行兩種轉換

不會。所有轉換處理都在瀏覽器內通過 JavaScript 完成,您輸入的文本不會被發送到 toolbase.cc 的伺服器。

不會。本工具只轉義 &<>"' 這 5 個字元。表情符號和中文等非 ASCII 字元在現代 UTF-8 環境下可以直接安全顯示,無需轉換。
工具君

閒話 ― 繼承自 SGML 的"字元引用"機制

HTML 實體(字元引用)的起源可以追溯到 HTML 的前身 SGML(標準通用標記語言)。1986 年標準化的 SGML 就已經具備了"字元引用"機制,用於在正文中使用標籤分隔符 < 本身。HTML 幾乎原封不動地繼承了這一機制,早在 20 世紀 90 年代 HTML 的初期規範中,&lt;&gt;&amp; 等基本命名實體就已經被定義。

在 Unicode 尚未普及的年代,命名實體最初被廣泛用於在純 ASCII 環境下顯示印刷用的特殊符號,例如版權符號 &copy;、註冊商標符號 &reg; 以及各種希臘字母。HTML5 規範最終定義了超過 2000 種命名實體,甚至涵蓋了對勾符號、音符符號等冷門字元。

如今隨著 UTF-8 編碼的普及,為避免亂碼而使用字元引用的必要性已大大降低。但 <、>、& 這三個字元至今仍必須轉義,原因完全不同:它們對 HTML 解析器而言具有特殊的語法含義(分別代表標籤的開始、結束以及實體的開始),一旦忘記轉義,就可能直接導致頁面佈局錯亂或引發XSS 漏洞