
Laravel 默认会自动过滤并转义 HTML 实体,导致 TinyMCE 编辑器提交的富文本(如 <p>Some description</p>)被剥离标签、仅保留纯文本。本文详解如何通过配置 TinyMCE 的 entity_encoding: 'raw' 并配合 Laravel 的安全处理,完整保留原始 HTML 字符串提交至后端。
laravel 默认会自动过滤并转义 html 实体,导致 tinymce 编辑器提交的富文本(如 `
some description
`)被剥离标签、仅保留纯文本。本文详解如何通过配置 TinyMCE 的 `entity_encoding: 'raw'` 并配合 Laravel 的安全处理,完整保留原始 HTML 字符串提交至后端。默认情况下,TinyMCE 为防止 XSS 风险,会对 HTML 内容进行实体编码(entity encoding)——例如将 <p> 转为
,而 Laravel 的请求中间件(如 TrimStrings、ConvertEmptyStringsToNull)及 Blade 模板的双花括号 {{ }} 渲染机制会进一步解码或过滤,最终导致控制器接收到的只是无格式的纯文本。
要解决该问题,需从前端编辑器配置入手,禁用 TinyMCE 的自动实体编码:
tinymce.init({
selector: '#editor',
entity_encoding: 'raw', // 关键:禁用 HTML 实体转义,保留原始标签
plugins: [
'advlist', 'anchor', 'autolink', 'charmap', 'code', 'fullscreen',
'help', 'image', 'insertdatetime', 'link', 'lists', 'media',
'preview', 'searchreplace', 'table', 'visualblocks'
],
toolbar: 'undo redo | styles | bold italic underline strikethrough | ' +
'alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image',
});✅ 此时,用户输入 <p>Hello <strong>World</strong></p> 将以原样字符串形式提交至 Laravel 后端(如 request()->innerText 值为 "<p>Hello <strong>World</strong></p>"),不再被转义。
⚠️ 注意事项:
立即学习“前端免费学习笔记(深入)”;
- 安全性不可忽视:启用 entity_encoding: 'raw' 后,前端不再自动转义,必须由后端严格校验与净化 HTML。切勿直接 echo $content 或使用 {{ $content }} 输出;应改用 {!! $content !!} 并确保内容已通过 htmlspecialchars() 反向过滤或使用专业库(如 league/html-sanitizer)白名单清洗。
-
Laravel 验证建议:可在 Request 验证中允许特定 HTML 标签(需结合 strip_tags() 或 Purifier 扩展):
// 使用 laravel-purifier(推荐) 'innerText' => ['required', 'string', 'max:10000'],
-
额外控制(可选):若需限制可用标签,可配合 valid_elements 配置:
valid_elements: 'p[style],br,strong,em,u,ol,ul,li,a[href|target],img[src|alt|width|height]'
总结:核心在于 TinyMCE 的 entity_encoding: 'raw' 配置,它让编辑器“诚实”提交原始 HTML;但真正的安全防线在 Laravel 后端——务必对富文本内容做服务端净化与上下文感知渲染,兼顾功能完整性与 XSS 防护。



















