如何安全地显示用户提交的HTML内容?

6

我正在进行类似于堆栈溢出的样式添加图片和格式到帖子的工作(尽可能通过stackoverflow帖子编辑工具),因此我有生成的html用于展示并可以在页面上使用。

但问题是如何安全地显示该html内容,当我尝试显示html时,它会像"<html>blah bhlah</html>"一样打印在页面上。如何在我的网页上安全地转义这个html内容?


这个页面有你正在寻找的一些答案https://dev59.com/Dm025IYBdhLWcg3wEhnr - one stevy boi
1
你想打印HTML源代码(这样看起来像<h1>Foo</h1>),还是想在页面中包含HTML(这样上面的内容将被呈现为标题“Foo”)?不太清楚。 - Adam
2个回答

3
在您的情况下发生的是,HTML 被转义了,因此呈现为文本。
我不知道您所写的语言,但我怀疑您使用了内置的文本转义函数。这将把 HTML 渲染为文本,但是这并不会使其变得安全。
我猜想您正在寻找的解决方案应该是:
  1. 解析 HTML 并对其进行消毒以删除任何潜在的恶意标签,例如 JavaScript、外部引用、iframes 等。
  2. 存储这些已消毒的 HTML。
  3. 将输入作为页面的一部分呈现。
StackExchange 仅支持 HTML 的严格子集,您可能希望模仿这种方法。
这不是一个简单的问题,您最好找到一些框架来为您解决这个问题,而不是自己动手。
例如,有些人可能想要尝试针对您的系统进行的一些攻击:
  • 添加</div>标签以避免包装元素。
  • 一些字符组合可能看起来不像有效的HTML,但仍然可以作为HTML处理。
  • 利用已经在页面上的一些Javascript代码。
  • 添加CSS以破坏页面布局。

请注意,最好存储用户输入的原始数据,并在使用时进行清理。这样可以修复清理器中的任何错误。当然,这也需要您正确编码传入的数据,以便您可以安全地存储它。请注意,所有编码都需要了解上下文才能正确编码。例如,SQL中的列名与字符串值需要不同的编码。而且,这些编码都不同于例如HTML属性数据所需的编码。还要注意可能包含其他格式的数据格式。例如,HTML->IFRAME->CSS->SVG。 - Mikko Rantalainen

1
这是一个两步骤的过程。首先,您需要使用此类库http://msdn.microsoft.com/en-us/security/aa973814.aspx对输入进行清理。它将删除脚本标记和其他人们可能尝试执行恶意操作的巧妙东西。
然后,您需要显示原始输出。在Asp.Net MVC中,它是@Html.Raw(x=>x.SomePropertyThatIsHtml)。如果您使用其他东西,它应该有一个相当的方法来防止编码。

链接无法使用。 - Hamza Khanzada

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