ToolDeck

HTML Escape / Unescape

Escape và unescape các HTML entity (& < > " v.v.)

Thử ví dụ

Đầu vào

Kết quả

Chạy cục bộ · An toàn để dán thông tin bí mật
Kết quả sẽ xuất hiện ở đây…

HTML Escaping là gì?

HTML escaping là quá trình thay thế các ký tự có ý nghĩa đặc biệt trong HTML bằng các entity reference tương ứng. Năm ký tự bắt buộc phải escape là: dấu và (&), dấu nhỏ hơn (<), dấu lớn hơn (>), dấu nháy kép ("), và dấu nháy đơn ('). Nếu không escape, trình duyệt sẽ hiểu các ký tự này là chỉ thị markup thay vì văn bản hiển thị, gây vỡ trang và tạo lỗ hổng cho các cuộc tấn công injection.

Đặc tả HTML (do WHATWG duy trì) định nghĩa hai dạng character reference: named entity như &amp; và numeric entity như &#38; hoặc &#x26;. Named entity dễ đọc hơn trong mã nguồn. Numeric entity (thập phân hoặc thập lục phân) có thể biểu diễn bất kỳ code point Unicode nào, hữu ích cho các ký tự không có named alias. Cả hai dạng đều tạo ra kết quả giống nhau trên trình duyệt.

Unescaping (hay còn gọi là decoding) là thao tác ngược lại: chuyển đổi các entity reference trở về ký tự gốc. Điều này thường gặp khi trích xuất văn bản từ mã nguồn HTML, di chuyển nội dung giữa các hệ thống, hoặc gỡ lỗi các template bị double-encode entity. Công cụ này xử lý cả hai chiều trong trình duyệt, giúp bạn kiểm tra logic escaping hoặc khôi phục văn bản thuần từ nguồn HTML phức tạp chỉ trong vài giây.

Tại sao dùng công cụ HTML Escape?

Việc thay thế thủ công dấu ngoặc nhọn và dấu và trong các khối văn bản lớn rất tốn thời gian và dễ sai. Một công cụ chuyên dụng thực hiện chuyển đổi toàn bộ đầu vào chỉ trong một bước, không cần cài đặt.

Chuyển đổi tức thì
Dán văn bản hoặc HTML và nhận kết quả đã escape hoặc unescape ngay lập tức. Không cần chờ phản hồi từ máy chủ vì toàn bộ xử lý diễn ra cục bộ trong JavaScript.
🔒
Xử lý ưu tiên bảo mật
Dữ liệu đầu vào không bao giờ rời khỏi trình duyệt. Không có gì được gửi đến máy chủ hay lưu trữ ở bất kỳ đâu, vì vậy bạn có thể an toàn escape các đoạn markup chứa thông tin xác thực, API key, hoặc mã nội bộ.
📋
Không cần tài khoản hay cài đặt
Mở trang và bắt đầu dán ngay. Không có cổng đăng nhập, không yêu cầu email, không có phần mềm nào cần cài đặt. Hoạt động trên mọi thiết bị có trình duyệt hiện đại.
🌐
Hỗ trợ đầy đủ các entity
Xử lý năm ký tự đặc biệt HTML bắt buộc cùng với numeric entity (thập phân và thập lục phân). Hỗ trợ chuyển đổi khứ hồi: escape rồi unescape sẽ trả về chuỗi gốc.

Các trường hợp sử dụng HTML Escape

Lập trình viên frontend: hiển thị đầu vào người dùng
Khi render văn bản do người dùng gửi vào trang, hãy escape trước để ngăn trình duyệt hiểu nó là thẻ HTML. Đây là biện pháp phòng thủ chính chống stored XSS trong bất kỳ template nào xuất ra chuỗi thô.
Kỹ sư backend: tạo phản hồi HTML
Mã phía máy chủ nối chuỗi vào HTML phải escape các giá trị động trước khi chèn. Dùng công cụ này để xác minh hàm escaping của bạn tạo ra kết quả đúng cho các trường hợp biên như nháy kép lồng nhau.
DevOps: nhúng cấu hình vào HTML
JSON nội tuyến hay lệnh shell trong trang HTML (ví dụ trong thẻ script hoặc thuộc tính data) cần được escape. Xác minh rằng dấu ngoặc nhọn và dấu và trong các đoạn cấu hình của bạn được mã hóa đúng cách.
Kỹ sư QA: kiểm tra các vector XSS
Dán các payload XSS phổ biến vào công cụ để xác nhận kết quả đầu ra của ứng dụng khớp với phiên bản đã escape chính xác. So sánh kết quả escape từng ký tự với những gì ứng dụng tạo ra.
Người viết tài liệu kỹ thuật: mẫu code trong tài liệu
Xuất bản đoạn code trong tài liệu dạng HTML (Jekyll, Hugo, CMS tùy chỉnh) yêu cầu escape dấu ngoặc nhọn cho cú pháp kiểu generic và placeholder template. Dán mẫu code và mọi ký tự đặc biệt sẽ được mã hóa ngay lập tức.
Sinh viên: tìm hiểu HTML entity
Gõ hoặc dán bất kỳ ký tự nào và xem dạng named entity và numeric entity của nó. Thử nghiệm với các trường hợp biên như non-breaking space, em dash, và ký hiệu Unicode để hiểu cách mã hóa ký tự HTML hoạt động.

Bảng tham chiếu HTML Entity

Bảng dưới đây liệt kê các HTML entity thường dùng. Năm ký tự đặc biệt (& < > " ') phải luôn được escape trong nội dung HTML và giá trị thuộc tính. Các entity khác là tùy chọn nhưng hữu ích cho các ký tự khó gõ hoặc mơ hồ trong mã nguồn.

Ký tựMô tảNamed entityNumeric entity
&Ampersand&amp;&#38;
<Less-than sign&lt;&#60;
>Greater-than sign&gt;&#62;
"Double quote&quot;&#34;
'Single quote / apostrophe&apos;&#39;
 Non-breaking space&nbsp;&#160;
©Copyright sign&copy;&#169;
®Registered sign&reg;&#174;
Em dash&mdash;&#8212;
Right single quote&rsquo;&#8217;
Euro sign&euro;&#8364;

Escaping và Unescaping: Khi nào dùng cái nào?

Hai thao tác này là nghịch đảo của nhau. Chọn sai chiều sẽ tạo ra kết quả double-encoded hoặc không được bảo vệ.

Escape (mã hóa)
Dùng khi chèn văn bản không tin cậy hoặc động vào HTML. Chuyển đổi < thành &lt; để trình duyệt hiển thị ký tự thay vì bắt đầu một thẻ. Áp dụng trước khi render đầu vào người dùng, các mục log, hoặc bất kỳ chuỗi nào có thể chứa markup.
Unescape (giải mã)
Dùng khi trích xuất văn bản thuần từ nguồn HTML. Chuyển đổi &lt; trở về <. Áp dụng khi di chuyển nội dung từ CMS, phân tích HTML đã cào, hoặc sửa các chuỗi double-encoded như &amp;amp; hiển thị tên entity thay vì ký tự.

Ví dụ mã

Dưới đây là các ví dụ về HTML escaping và unescaping trong bốn ngôn ngữ. Mỗi đoạn code đề cập cả hai chiều và xử lý các trường hợp biên như nháy kép lồng nhau và numeric entity.

JavaScript (browser / Node.js)
// Escape HTML entities manually
function escapeHtml(str) {
  return str
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#39;')
}

escapeHtml('<img src="x" onerror="alert(1)">')
// → "&lt;img src=&quot;x&quot; onerror=&quot;alert(1)&quot;&gt;"

// Unescape using DOMParser (browser only)
function unescapeHtml(str) {
  const doc = new DOMParser().parseFromString(str, 'text/html')
  return doc.documentElement.textContent
}

unescapeHtml('&lt;div&gt;Hello&lt;/div&gt;')
// → "<div>Hello</div>"
Python
import html

# Escape special characters
html.escape('<script>alert("XSS")</script>')
# → '&lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;'

# Escape including single quotes (quote=True is default in Python 3.8+)
html.escape("It's <b>bold</b>", quote=True)
# → 'It&#x27;s &lt;b&gt;bold&lt;/b&gt;'

# Unescape entities back to characters
html.unescape('&lt;p&gt;Price: &euro;10&lt;/p&gt;')
# → '<p>Price: €10</p>'

# Unescape numeric entities
html.unescape('&#60;div&#62;&#38;amp;&#60;/div&#62;')
# → '<div>&amp;</div>'
Go
package main

import (
    "fmt"
    "html"
)

func main() {
    // Escape HTML special characters
    escaped := html.EscapeString(`<a href="page?id=1&sort=name">Link</a>`)
    fmt.Println(escaped)
    // → &lt;a href=&quot;page?id=1&amp;sort=name&quot;&gt;Link&lt;/a&gt;

    // Unescape back to original
    original := html.UnescapeString("&lt;b&gt;Go &amp; HTML&lt;/b&gt;")
    fmt.Println(original)
    // → <b>Go & HTML</b>
}
PHP
<?php
// Escape HTML entities (ENT_QUOTES escapes both " and ')
echo htmlspecialchars('<p class="info">Tom & Jerry's</p>', ENT_QUOTES, 'UTF-8');
// → &lt;p class=&quot;info&quot;&gt;Tom &amp; Jerry&#039;s&lt;/p&gt;

// Convert all applicable characters to HTML entities
echo htmlentities('Price: 10€ — 50% off', ENT_QUOTES, 'UTF-8');
// → Price: 10&euro; &mdash; 50% off

// Decode entities back
echo html_entity_decode('&lt;div&gt;&amp;copy; 2026&lt;/div&gt;');
// → <div>&copy; 2026</div>

Câu hỏi thường gặp

Sự khác biệt giữa HTML escaping và URL encoding là gì?
HTML escaping thay thế các ký tự đặc biệt trong HTML (< > & " ') bằng entity reference như &lt; để chúng hiển thị dưới dạng văn bản. URL encoding (percent-encoding) thay thế các ký tự không an toàn trong URL bằng chuỗi hex %XX. Chúng bảo vệ các ngữ cảnh khác nhau: HTML escaping ngăn injection markup, còn URL encoding đảm bảo chuỗi truy vấn và phân đoạn đường dẫn hợp lệ.
Những ký tự nào phải được escape trong HTML?
Năm ký tự phải luôn được escape là: & (dấu và), < (dấu nhỏ hơn), > (dấu lớn hơn), " (dấu nháy kép trong thuộc tính), và ' (dấu nháy đơn trong thuộc tính). Không escape bất kỳ ký tự nào trong số này có thể gây vỡ render hoặc tạo lỗ hổng cross-site scripting.
&apos; có hợp lệ trong HTML5 không?
Có. Named entity &apos; được định nghĩa trong đặc tả HTML5 và được hỗ trợ bởi tất cả trình duyệt hiện đại. Nó không có trong HTML 4, vốn chỉ nhận biết &amp;, &lt;, &gt;, và &quot;. Nếu bạn cần hỗ trợ các parser HTML 4 rất cũ, hãy dùng dạng numeric &#39; thay thế.
Làm sao sửa các HTML entity bị double-encoded như &amp;amp;?
Double encoding xảy ra khi một chuỗi đã được escape đi qua hàm escaping lần thứ hai. Cách sửa là unescape cho đến khi kết quả ổn định. Dán chuỗi double-encoded vào công cụ này ở chế độ unescape, rồi chạy lại nếu vẫn còn tham chiếu &amp;. Để ngăn double encoding, hãy kiểm tra xem đầu vào đã được escape chưa trước khi áp dụng hàm escape.
Tôi có thể dùng HTML entity trong chuỗi JavaScript không?
HTML entity được trình phân tích HTML xử lý, không phải JavaScript engine. Bên trong thẻ script, code chạy sau khi trình phân tích HTML xử lý trang, vì vậy &lt; trong thẻ script trở thành < trước khi JavaScript thấy nó. Với inline event handler (onclick, v.v.), giá trị thuộc tính được HTML-decode trước rồi mới thực thi như JavaScript. Trong file .js bên ngoài, entity không có ý nghĩa đặc biệt và được hiểu là văn bản thô.
Sự khác biệt giữa htmlspecialchars và htmlentities trong PHP là gì?
htmlspecialchars() chỉ escape năm ký tự đặc biệt (& < > " ') ảnh hưởng đến cấu trúc HTML. htmlentities() escape cả năm ký tự đó cộng với mọi ký tự có named HTML entity, như ký hiệu bản quyền và chữ cái có dấu. Về mục đích bảo mật, htmlspecialchars() với ENT_QUOTES là đủ. htmlentities() hữu ích khi bạn cần đầu ra chỉ dùng ASCII cho các hệ thống không xử lý được UTF-8.
HTML escaping có đủ để ngăn XSS không?
HTML escaping ngăn XSS trong trường hợp phổ biến nhất: chèn văn bản không tin cậy vào nội dung phần tử HTML hoặc giá trị thuộc tính. Nó không bảo vệ các ngữ cảnh injection khác. Chèn dữ liệu người dùng vào thẻ script yêu cầu JavaScript string escaping. Chèn vào thuộc tính style yêu cầu CSS escaping. Chèn vào thuộc tính URL (href, src) yêu cầu xác thực URL cộng với encoding. Một biện pháp phòng thủ XSS toàn diện áp dụng escaping phù hợp với ngữ cảnh tại mọi điểm chèn.