{!! $content !!} 可输出原始HTML,但仅限内容绝对可信时使用,否则必须配合HTML Purifier等净化处理以防范XSS攻击;{{ $content }} 默认转义所有HTML标签,确保安全但无法渲染富文本。

直接用 {!! $content !!} 是最危险的快捷方式,除非你已确保内容绝对可信;绝大多数场景下,必须配合 HTML 净化处理,否则 XSS 风险无法规避。
为什么 {{ $content }} 不能输出富文本
Blade 的 {{ }} 会调用 htmlentities(),把所有标签转义成纯文本。比如 <strong>Hello</strong> 会原样显示为文字,而不是加粗效果。这不是 bug,是默认安全策略。
什么时候能用 {!! $content !!}?
仅限以下情况之一成立时才可考虑:
- 内容完全由管理员后台录入,且未开放给普通用户编辑
- 内容来自可信系统内部(如 CMS 导出的静态 HTML 片段)
- 已在控制器或模型层完成严格净化(例如用
Purifier::clean()处理过)
只要有一条不满足,就不要用 {!! !!} —— 它等于主动关闭 XSS 防护。
立即学习“前端免费学习笔记(深入)”;
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
如何用 Purifier 实现安全输出
安装后,在视图中直接使用 clean() 辅助函数是最轻量、最可控的方式:
{!! clean($post->content) !!}
它等价于 Purifier::clean($post->content),但无需在每个视图里写 use。注意三点:
- 默认规则允许常见格式(
p,br,strong,em等),不允许可执行标签(script,iframe,onerror属性等) - 若需扩展白名单,修改
config/purifier.php中的HTML.Allowed配置项 - 不要对同一字段重复净化:模型中用了
CleanHtmlcast,视图里再套clean()属于冗余,也可能触发二次过滤异常
动态加载 HTML 文件时的陷阱
如果通过 file_get_contents() 读取本地 HTML 文件并传给视图,仍需净化:
- 文件路径不可被用户控制(避免目录遍历,如
../../etc/passwd) - 文件内容本身可能含恶意脚本(尤其来自用户上传或第三方导入)
- 即使文件存于
resources/views下,Blade 也不会自动净化其内容 ——@include或View::make()只做渲染,不负责安全校验
最稳妥做法:读取后先过一遍 clean(),再传入视图,或直接在视图中用 {!! clean(file_get_contents(...)) !!}(仅限路径完全可控时)。


















