如何在Laravel中保护网页免受XSS攻击,同时允许用户显示HTML内容?

3
我看到网上说,在Laravel 5中应该始终使用{{...}}来转义用户提交到数据库的数据。然而,我的网站上的会员使用TinyMCE。我已经在TinyMCE中过滤了脚本和PHP标签,但我想显示使用HTML格式化的文本。因此,我使用{!!...!!} Blade标记。论坛和其他允许人们输入HTML的网站是如何保护免受XSS攻击的呢?我需要在我的网站上使用哪些技术来降低成功XSS攻击的机会呢?

不要使用转义,而是要过滤:http://htmlpurifier.org/。在这里你必须使用一个好的库——人们通常尝试编写自己的“轻量级”库,但从安全角度来看,这通常是一个坏主意。 - halfer
请参考我的回答,其中提供了一些通用的技巧(虽然不是针对Laravel的)。 - SilverlightFox
2个回答

0

确保至少剥离所有脚本标签并删除其他元素的处理程序。关键是要确保不允许JS运行。另一个选项是从另一个子域提供html,并将其作为带有沙盒属性设置的iframe加载。

另一个选择是,而不是让他们提交HTML,使用类似markdown的东西。

还可以剥离任何URL。


1
Markdown本身不足以保护免受XSS攻击:https://michelf.ca/blog/2010/markdown-and-xss/ - 它仍然需要过滤。 - halfer
@halfer 绝对同意。 - Kevin Nagurski
我的答案在这里扩展了这种方法,虽然我的方法是回答脚本允许的要求。如果不允许,请从沙盒属性中删除allow-scripts - SilverlightFox

0

关键是要使用类似于Html Purifier的库来对用户输入的内容进行白名单或者过滤。

如果您想了解可用的HTML过滤库的简短列表和比较,可以查看HTML Purifier的比较页面

您可能还想阅读html5sec

无论您做什么,都不要尝试编写自己的解决方案,以尝试“提取真正需要的方法”。重新发明轮子总是浪费时间,但在这种情况下,它可能会引入您无法预见的风险。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接