HTML 轉義/反轉義
將 &、<、>、"、' 等特殊字元轉換為 HTML 實體(轉義),或將實體還原為原始字元(反轉義)。適用於防範 XSS 攻擊及在 HTML 中嵌入文本。
常用命名 HTML 實體一覽
| 字元 | 命名實體 | 數字字元引用 | 說明 |
|---|---|---|---|
| & | & | & | 和號(表示"and"的符號) |
| < | < | < | 小於號(與 HTML 標籤的起始字元相同) |
| > | > | > | 大於號(與 HTML 標籤的結束字元相同) |
| " | " | " | 雙引號(屬性值的分隔符) |
| ' | ' | ' | 單引號(屬性值的分隔符) |
| |   | 不換行空格(不會觸發換行的空白字元) | |
| © | © | © | 版權符號 |
| ® | ® | ® | 註冊商標符號 |
| ™ | ™ | ™ | 商標符號 |
| € | € | € | 歐元符號 |
| ¥ | ¥ | ¥ | 日元符號 |
| ¢ | ¢ | ¢ | 美分符號 |
什麼是 HTML 跳脫
HTML 跳脫是把 &・<・>・"・' 這五個特殊字元,轉換為瀏覽器不會當作語法解析的其他表記(HTML 實體)的處理。若把使用者輸入的字串原樣嵌入 HTML,< 與 > 會被誤認為標籤的開始與結束而導致排版錯亂,還可能引發 <script> 之類惡意程式碼被執行的 XSS(跨站腳本)。HTML 跳脫正是防範該風險的基本對策。
反跳脫則相反,是把 & 之類具名實體或 & 之類數值字元參照還原為原本字元的處理。適用於從其他網站複製 HTML 原始碼時,或查看 CMS、討論區的發文資料時,希望把以實體表記難以閱讀的原文還原出來的場合。轉換僅由瀏覽器內的 JavaScript 完成,輸入內容不會傳送至外部。
HTML 跳脫的使用方式
- 選擇模式 若想把字元轉換為實體請選擇「跳脫」,若想把實體還原為原本字元請選擇「反跳脫」。
- 把文字貼到輸入欄 把想嵌入 HTML 的字串,或含有實體表記的字串貼到輸入欄。
- 確認轉換結果 輸入的同時會即時反映到下方的轉換結果欄。重新編輯輸入則每次都會重新計算。
- 複製結果 可用「複製」按鈕把轉換結果送入剪貼簿,直接貼到 CMS 內文或原始碼中。
用好本工具的小技巧
- HTML 轉義是防範 XSS(跨站指令碼攻擊)的基礎手段。在將使用者輸入嵌入 HTML 之前,務必先進行轉義處理。
&必須最先轉義。如果先轉換其他字元,新生成的&中的&會被再次轉義,造成重複轉義。- 在屬性值中嵌入字串時,除了
"(雙引號)外,最好連'(單引號)也一併轉義,這樣更安全。 - 本工具支援將十進位制數字引用(
&)、十六進位制數字引用(&)以及常用命名實體(如&)反轉義還原。 - 許多模板引擎(Blade、JSX、Vue 等)在插入變數時會自動進行 HTML 轉義,但如果使用
{!! !!}或 v-html 這類"原始 HTML 輸出"語法,就需要自行手動轉義。
HTML 跳脫的應用情境
在 CMS、部落格文章中嵌入引用
在內文中刊載程式碼或其他網站的引文時,若把含 <、> 的字串原樣貼上,會被誤認為標籤而導致顯示錯亂。事先跳脫後再貼上即可安全顯示。
確認討論區、留言區的發文內容
想查看以實體表記原樣保存在討論區或留言區資料庫中的發文時,可用反跳脫還原為原文以便閱讀。
在 Markdown 中嵌入 HTML 片段
若想在 Markdown 文件中原樣顯示 HTML 標籤的範例或範例程式碼,事先跳脫即可避免被 Markdown 剖析器或瀏覽器當作標籤解析,從而以字串形式顯示。
HTML 樣板的除錯
在樣板引擎輸出的 HTML 原始碼中尋找意外被跳脫(或遺漏跳脫)之處時,也可用於對照轉換前後的字串。
用語集
- HTML 實體(字元實體參照)
- 在 HTML 文件中安全顯示具有特殊含義之字元的表記法。具名形式以「&」開頭、以「;」結尾,如
&。 - 數值字元參照
- 以 Unicode 碼位編號指定字元的表記法。十進位寫作
&,十六進位寫作&,兩者表示同一字元。 - XSS(跨站腳本)
- 使用者輸入中所含腳本未經跳脫即被嵌入頁面,從而在其他使用者瀏覽器中執行非預期程式碼的漏洞。HTML 跳脫是代表性的對策之一。
- 淨化(sanitize)
- 泛指從外部接收的資料中去除危險要素、或將其轉換為無害形式的處理。HTML 跳脫是淨化的一種。
- &(和號)的跳脫
- 跳脫處理中應最先轉換的字元。若先轉換其他字元,產生的
&等中的&也會被二次跳脫,因此處理順序至關重要。 - 屬性值的分隔符號
- 指包裹 HTML 標籤屬性值的
"(雙引號)或'(單引號)。屬性值中若含這些字元而不跳脫,便會被誤認為屬性的分隔。
常見問題
<、>、& 這三個字元會被 HTML 解析器當作語法的一部分來解釋。如果忘記轉義,瀏覽器可能會誤認為是標籤的開始或結束,從而導致頁面佈局錯亂,甚至引發XSS(惡意指令碼注入)攻擊。&、<、>、"、' 這 5 個字元。表情符號和中文等非 ASCII 字元在現代 UTF-8 環境下可以直接安全顯示,無需轉換。
閒話 ― 繼承自 SGML 的"字元引用"機制
HTML 實體(字元引用)的起源可以追溯到 HTML 的前身 SGML(標準通用標記語言)。1986 年標準化的 SGML 就已經具備了"字元引用"機制,用於在正文中使用標籤分隔符 < 本身。HTML 幾乎原封不動地繼承了這一機制,早在 20 世紀 90 年代 HTML 的初期規範中,<、>、& 等基本命名實體就已經被定義。
在 Unicode 尚未普及的年代,命名實體最初被廣泛用於在純 ASCII 環境下顯示印刷用的特殊符號,例如版權符號 ©、註冊商標符號 ® 以及各種希臘字母。HTML5 規範最終定義了超過 2000 種命名實體,甚至涵蓋了對勾符號、音符符號等冷門字元。
如今隨著 UTF-8 編碼的普及,為避免亂碼而使用字元引用的必要性已大大降低。但 <、>、& 這三個字元至今仍必須轉義,原因完全不同:它們對 HTML 解析器而言具有特殊的語法含義(分別代表標籤的開始、結束以及實體的開始),一旦忘記轉義,就可能直接導致頁面佈局錯亂或引發XSS 漏洞。