创建容器。
2. 防止 XSS 攻击
用户输入 ,直接渲染会执行。先转义:
<script>alert('xss')</script>
显示为文本,不执行。
3. 显示特殊符号
| 字符 | 实体 |
| © | © |
| ® | ® |
| ™ | ™ |
| € | € |
| ¥ | ¥ |
| £ | £ |
| ¢ | ¢ |
| § | § |
| ¶ | ¶ |
| • | • |
| … | … |
| — | — |
| – | – |
| " | “ " |
| ' | ‘ ' |
| ← | ← |
| → | → |
| ↑ | ↑ |
| ↓ | ↓ |
| ★ | ☆ |
| ✓ | ✓ |
| ✗ | ✗ |
4. 连续空格
HTML 默认空格折叠为一个。 表示不换行空格:
<p>多 空格</p> <!-- 显示:多 空格 -->
<p>多 空格</p> <!-- 显示:多 空格 -->
5. 软换行
或 长单词可断行处。
必转义字符
5 个特殊字符必须转义:
| 字符 | 实体 | 用途 |
< | < | 标签起始 |
> | > | 标签结束 |
& | & | 实体起始 |
" | " | 属性值 |
' | ' | 属性值(单引号) |
52tool HTML 实体工具
工具地址:HTML 实体编码
功能
- HTML 编码(实体化)
- HTML 解码(去实体)
- 编号实体(<)和命名实体(<)切换
- 浏览器端处理
实战 1:编码
输入:
<div class="box">Hello & "World"</div>
输出:
<div class="box">Hello & "World"</div>
实战 2:解码
输入:
<script>alert(1)</script>
输出:
<script>alert(1)</script>
编程实现
JavaScript
// 编码
function htmlEncode(str) {
const div = document.createElement('div');
div.textContent = str;
return div.innerHTML;
}
// 解码
function htmlDecode(str) {
const div = document.createElement('div');
div.innerHTML = str;
return div.textContent;
}
// 或用正则
function htmlEncode(str) {
return str.replace(/[<>&"']/g, c => ({
'<': '<',
'>': '>',
'&': '&',
'"': '"',
"'": '''
})[c]);
}
Python
import html
# 编码
encoded = html.escape('<div>Hello & "World"</div>')
# '<div>Hello & "World"</div>'
# 解码
decoded = html.unescape('<script>alert(1)</script>')
# '<script>alert(1)</script>'
PHP
// 编码
$encoded = htmlspecialchars('<div>Hello & "World"</div>', ENT_QUOTES);
// '<div>Hello & "World"</div>'
// 解码
$decoded = htmlspecialchars_decode('<script>alert(1)</script>');
Java
import org.apache.commons.text.StringEscapeUtils;
String encoded = StringEscapeUtils.escapeHtml4("<div>Hello</div>");
String decoded = StringEscapeUtils.unescapeHtml4("<div>");
实战场景
场景 1:显示代码
在网页显示 HTML 代码:
<pre><div class="box">
Hello
</div></pre>
显示为代码块。
场景 2:用户评论防 XSS
用户输入:
<script>fetch('/api/user', {credentials: 'include'})</script>
后端转义后存数据库,渲染时安全:
<script>fetch('/api/user', {credentials: 'include'})</script>
显示为文本,不执行。
场景 3:属性值转义
<input value="用户输入">
如果用户输入含 ",会破坏 HTML。先转义:
<input value="用户"输入">
场景 4:URL 参数
URL 中的特殊字符转义用 URL 编码(不是 HTML 实体):
https://example.com/?q=hello%20world
参考 URL 编解码。
场景 5:JSON 数据
JSON 字符串中的双引号需转义:
{
"text": "He said \"Hello\""
}
参考 JSON 格式化。
XSS 防御
1. 输出转义
所有用户输入在渲染前转义:
function safeRender(userInput) {
const div = document.createElement('div');
div.textContent = userInput; // 自动转义
document.body.appendChild(div);
}
2. 不同上下文不同转义
#### HTML 上下文
<div>{userInput}</div>
转义 < > & " '。
#### 属性上下文
<input value="{userInput}">
转义 " &。
#### JavaScript 上下文
const data = { userInput: "{userInput}" };
转义 ' " \,并加 JSON.stringify。
#### URL 上下文
<a href="{userInput}">link</a>
验证 URL 协议(禁止 javascript:),URL 编码。
3. CSP 防护
Content Security Policy 限制脚本来源:
Content-Security-Policy: script-src 'self'
即使 XSS 注入 ,浏览器拒绝执行。
4. HttpOnly Cookie
防止 XSS 偷 Cookie:
Set-Cookie: session=abc; HttpOnly; Secure
JavaScript 无法读取,XSS 攻击无效。
命名实体 vs 编号实体
命名实体
< > & " ©
易记,但只覆盖常用字符。
编号实体
十进制:
< → <
> → >
© → ©
十六进制:
< → <
> → >
© → ©
覆盖所有 Unicode 字符。
转换
命名 < = 十进制 < = 十六进制 <
常见特殊符号实体
货币
| 符号 | 实体 | 描述 |
| $ | $ | 美元 |
| € | € | 欧元 |
| £ | £ | 英镑 |
| ¥ | ¥ | 日元/人民币 |
| ¢ | ¢ | 分 |
| ₹ | ₹ | 印度卢比 |
| ₩ | ₩ | 韩元 |
| ₽ | ₽ | 俄罗斯卢布 |
数学
| 符号 | 实体 |
| + | + |
| − | − |
| × | × |
| ÷ | ÷ |
| ≤ | ≤ |
| ≥ | ≥ |
| ≠ | ≠ |
| ≈ | ≈ |
| ∞ | ∞ |
| √ | √ |
| ∑ | ∑ |
| ∫ | ∫ |
| π | π |
箭头
| 符号 | 实体 |
| ← | ← |
| ↑ | ↑ |
| → | → |
| ↓ | ↓ |
| ↔ | ↔ |
| ⇐ | ⇐ |
| ⇒ | ⇒ |
| ⇔ | ⇔ |
卡牌花色
国际象棋
进阶技巧
技巧 1:用 Unicode 字符直接
<p>© 2026</p>
直接用 Unicode 字符,无需实体。但建议用实体保证兼容性。
技巧 2:CSS 转义
CSS 中特殊字符用反斜杠转义:
.content::before {
content: "\201C"; /* 左引号 */
}
技巧 3:JavaScript 字符串转义
const text = "He said \"Hello\"";
const text2 = 'It\'s a test';
const text3 = "Line1\nLine2";
技巧 4:URL 编码
encodeURIComponent('hello world & foo');
// 'hello%20world%20%26%20foo'
参考 URL 编解码。
技巧 5:Base64 编码
二进制数据转 Base64 用于数据传输:
btoa('Hello, World!');
// 'SGVsbG8sIFdvcmxkIQ=='
参考 Base64 编解码。
与其他工具配合
HTML + Base64
工具:Base64 编解码
HTML 嵌入 Base64 图片。
HTML + URL 编码
工具:URL 编解码
URL 参数转义。
HTML + JSON
工具:JSON 格式化
JSON 中的字符串需要 HTML 转义后渲染。
常见问题
Q: 实体编码能防所有 XSS 吗?
A: 不能。HTML 实体编码只防 HTML 上下文 XSS。JavaScript 上下文、URL 上下文需要不同转义。完整防御需要:1) 不同上下文不同转义;2) CSP;3) HttpOnly Cookie。
Q: 命名实体和编号实体哪个好?
A: 命名实体易记,编号实体覆盖全。常用字符用命名,特殊字符用编号。
Q: 工具支持哪些字符?
A: 52tool HTML 实体工具支持所有 Unicode 字符的编码/解码。
Q: 转义会改变数据吗?
A: 不改变语义,只改变表示。< 渲染后还是 <。
Q: 浏览器自动转义吗?
A: JavaScript textContent 自动转义,innerHTML 不转义(危险)。建议用 textContent。
Q: 工具会泄露我的内容吗?
A: 52tool HTML 实体工具在浏览器端运行,输入不上传服务器。
常见问题解答
Q: 怎么转义 < 符号?
A: 用 <。如显示 在网页上:
<div>。
Q: 怎么转义双引号?
A: 用 "。在 HTML 属性中:value=""hello""。
Q: 怎么显示连续空格?
A: 用 。如 多 空格 显示 "多 空格"。
Q: 怎么防 XSS?
A: 1) 所有用户输入在渲染前用 textContent 或转义;2) 后端存储前转义;3) 用 CSP;4) HttpOnly Cookie。参考 52tool HTML 实体工具。
Q: 怎么转义大段 HTML?
A: 用 标签 + 全文转义。或 Markdown 代码块(自动转义)。参考 52tool Markdown 编辑器。
Q: 转义后的字符能被搜索吗?
A: 看搜索引擎。HTML 实体在源码中是 <,渲染后是 <。搜索引擎通常按渲染后内容索引。
总结
HTML 实体是前端基础:
- 在线工具 → 52tool HTML 实体
- 必转义 →
< > & " '
- 防 XSS → 不同上下文不同转义
- 显示特殊符号 → 命名或编号实体
记住:用户输入必须转义后渲染,textContent 比 innerHTML 安全,5 个必转义字符记牢。