如何在 laravel 视图的输出上应用 xss 过滤器?

Posted

技术标签:

【中文标题】如何在 laravel 视图的输出上应用 xss 过滤器?【英文标题】:how can I apply xss filter on output of laravel views? 【发布时间】:2016-02-15 20:35:06 【问题描述】:

我知道我可以使用 转义输出文本中的所有 html 标签,但我只想转义不安全标签而不是所有标签(例如,我想在文本中使用 br 标签)

【问题讨论】:

查看这个:***.com/questions/26023823/… 这里讨论了一个类似的问题。 ***.com/questions/26023823/… 我都看到了,我需要一个只过滤危险代码的输出过滤器,在 laravel 模板视图引擎中是否有类似的东西,或者我应该自己实现它。 @MohammadRezaEsmaeilzadeh 您需要查找并使用利用白名单而非黑名单的解决方案。您还需要过滤属性,以及清理 href 以使其仅指向 http/https。还有更多,但您不想走上只过滤危险标签的道路......因为几乎任何标签都可能是危险的属性。 【参考方案1】:

您绝对应该自己实现它。我假设您想要转义的标签可能只是 <script><iframe>,但是在我看来,完全删除该内容而不是无缘无故地在您的页面上保留转义内容更为合适。

您可以使用regex 进行简单替换,例如

$html = preg_replace("/<iframe.*?>/", "", $html);
$html = preg_replace("/<script(.*?)>(.*?)<\/script>/", "", $html);

但它被认为是不好的做法,因为不存在完美的正则表达式,因此您的安全性可能存在漏洞。

一个更好的主意是使用 php DOMDocument Parser。您可以执行以下操作来删除脚本标签:

$doc = new DOMDocument();

$doc->loadHTML($html);

$script_tags = $doc->getElementsByTagName('script');

for ($i = 0; $i < $script_tags->length; $i++) 
    $script_tags->item($i)->parentNode->removeChild($script_tags->item($i));


$clean_html = $doc->saveHTML();

【讨论】:

以上是关于如何在 laravel 视图的输出上应用 xss 过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel 5中创建用于XSS防御的中间件?

Laravel(4.1.24)将查询输出传递给视图时数组到字符串的转换

如何在 Laravel 5 中的视图模板上显示会话数据

如何在从视图刀片 laravel 加载的 vue 组件上添加条件?

如何更改 Laravel5 中的视图文件夹?

在 Laravel 4 中缓存视图输出