如何在Laravel Blade模板中处理渲染内容的iframe过滤问题
解决方案
首先明确:Blade 的 {!! !!} 语法本身不会自动移除任何 HTML 标签,你遇到的 iframe 被删除的问题,本质是项目中存在 HTML 内容净化逻辑(大概率是集成了 HTMLPurifier 这类安全过滤扩展),默认将 iframe 判定为不安全标签做了过滤处理。
方案1:调整 HTMLPurifier 配置(最推荐,兼顾安全和需求)
大部分 Laravel 项目会用 mews/purifier 扩展做 XSS 防护,你可以通过修改配置放行合法的 iframe:
- 首先发布扩展的配置文件(如果之前没发布过):
php artisan vendor:publish --provider="Mews\Purifier\PurifierServiceProvider"
- 打开生成的
config/purifier.php文件,找到HTML.Allowed配置项,在允许的标签列表中新增 iframe 及你需要用到的属性:
'HTML.Allowed' => 'div,b,strong,i,em,a[href|title],ul,ol,li,p[style],br,span[style],img[width|height|alt|src],iframe[src|width|height|frameborder|allowfullscreen]',
- 新增 iframe 域名白名单配置,避免恶意 iframe 带来的安全风险,在同配置文件中添加:
'URI.SafeIframeRegexp' => '%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/|你需要放行的可信域名)%',
配置完成后直接用 {!! clean($post->content) !!} 或者 {!! Purifier::clean($post->content) !!} 输出内容即可。
方案2:自定义内容过滤逻辑
如果你的项目没有用第三方净化扩展,是自己写的标签过滤逻辑,只需要调整过滤规则,将 iframe 加入允许的标签白名单即可。
不推荐直接不加任何过滤输出原生 HTML 内容,会存在严重的 XSS 攻击风险。
方案3:临时用 strip_tags 快速放行(仅建议测试用)
如果只是临时测试,可以用 strip_tags 函数指定允许的标签,语法如下:
{!! strip_tags($post->content, '<p><div><img><iframe><a><ul><ol><li>') !!}
注意该方法不会过滤标签属性,安全性低,不要用于生产环境。
内容的提问来源于stack exchange,提问作者Fika Ridaul Maulayya
相关产品推荐
相关产品推荐

