富文本处理需前后端双重净化、表单同步、utf-8全链路编码及粘贴内容过滤。前端用dompurify.sanitize(),后端用sanitize-html/bleach/htmlpurifier;手动同步编辑器内容至textarea;设accept-charset="utf-8"及utf8mb4数据库;粘贴时启用纯文本模式或净化后再插入。

富文本内容提交前必须转义 HTML 实体
浏览器会把 <script></script>、<img src="x" onerror="alert(1)" alt="HTML表单怎样处理富文本输入_HTML表单处理富文本输入流程【详解】" > 这类内容当真实标签执行,直接插入 DOM 或提交到后端就等于开后门。哪怕你用的是 CKEditor 或 TinyMCE,它们默认也不替你做服务端安全过滤。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 前端提交前,对富文本字段值调用
DOMPurify.sanitize()(轻量、主流、支持白名单),不是简单 replace和 <code>> - 后端收到
content字段后,仍需二次净化——前端可被绕过,不能信任 - 别用
innerHTML = userContent直接渲染;改用textContent显示预览,或用insertAdjacentHTML('beforeend', sanitized)配合净化结果 - 如果后端是 Node.js,推荐
sanitize-html库;Python 用bleach;PHP 用HTMLPurifier
form 表单 submit 时富文本编辑器内容没同步到 <textarea></textarea>
多数富文本编辑器(如 Quill、CKEditor 5)不自动绑定到原生表单控件,submit 触发时,<textarea name="content"></textarea> 的 value 仍是空或旧值,后端收不到新内容。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 监听编辑器的
change或blur事件,手动更新对应<textarea></textarea>的value,例如:textarea.value = editor.root.innerHTML - 在
form.onsubmit里再强制取一次:防止用户快速点击提交、事件未及时触发 -
CKEditor 5推荐用editor.getData()而非直接读 DOM,它会处理内嵌 widget、占位符等特殊情况 - 如果用了
Quill,注意quill.root.innerHTML可能含<br>尾部冗余,提交前用.replace(/<br>$/i, '')清理
后端接收富文本时 Content-Type 和编码容易出错
富文本常含中文、emoji、数学符号,若请求头没声明 charset=utf-8,或后端没按 UTF-8 解码,就会出现乱码、截断、甚至解析失败。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 确保表单
<form></form>带accept-charset="UTF-8"属性 - POST 请求头必须含
Content-Type: application/x-www-form-urlencoded; charset=UTF-8(fetch默认不带,要显式设置) - Node.js 的
body-parser需配encoding: 'utf8';PHP 要确认mb_internal_encoding('UTF-8')已设 - 数据库字段用
utf8mb4(不是utf8),否则 emoji 会变???
富文本粘贴进编辑器时样式错乱或脚本残留
用户从 Word、网页、Notion 复制内容进来,常带内联 style、class、font 标签,甚至隐藏的 <script></script> 注释块,影响展示一致性,也埋下 XSS 风险。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 启用编辑器的
pastePlainText模式(如Quill的clipboard.dangerouslyPasteHTML别乱用) -
CKEditor 5推荐配置pasteFromOffice插件 + 自定义onPaste回调,用DOMPurify先清一遍再插入 - 禁止粘贴时保留
style属性:大多数编辑器支持removeFormat或stripAttributes配置项 - 测试时务必用 Word 文档 + 微信公众号文章 + 网页控制台复制三种来源交叉验证











