【问题标题】:How to safely display html content submitted by user?如何安全显示用户提交的html内容?
【发布时间】:2014-04-18 22:44:57
【问题描述】:

我正在做堆栈溢出样式,将图像和格式添加到帖子中[尽可能通过 stackoverflow 帖子编辑工具],因此我为演示文稿生成了 html,可用于在页面上显示。

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

【问题讨论】:

  • 这个页面有一些你正在寻找的答案stackoverflow.com/q/6234773/3529744
  • 你想打印 HTML 源代码(所以它看起来像 <h1>Foo</h1> 还是你想在页面中包含 HTML (这样 abobe 将显示为标题“Foo”) ? 不清楚

标签: javascript html security web


【解决方案1】:

您的情况是 HTML 被转义,因此呈现为文本。

我不知道您使用的是什么语言,但我怀疑您使用了内置的文本转义功能。这会将 HTML 呈现为文本,但这不会使其安全

我怀疑您正在寻找的解决方案将:

  1. 解析 HTML 并对其进行清理以删除任何潜在的恶意标签,例如 JavaScript、外部引用、iframe 等。
  2. 存储此净化过的 HTML。
  3. 将输入呈现为页面的一部分。

StackExchange supports only a sctrict subset of HTML,您可能想效仿所采用的方法。

这不是一个要解决的简单问题,您很可能希望找到一些可以为您解决此问题的框架,而不是自己动手。

例如,某些人可能想要尝试对您的系统进行攻击:

  • 额外的</div> 标记来转义包装元素。
  • 某些字符组合可能看起来不像有效的 HTML,但行为却是这样。
  • 利用页面上已有的一些 Javascript。
  • 添加 CSS 以打破页面布局。

【讨论】:

  • 请注意,最好逐字存储用户输入并在使用期间对其进行清理。这允许修复 sanitizer 中的任何错误。当然,它还要求您正确编码传入的数据,以便您可以安全地逐字存储它。请注意,所有编码都需要了解 context 才能正确编码。例如,传入数据需要对 SQL 中的列名和字符串值进行不同的编码。而且这些编码中的任何一种都与例如所需的编码不同。 HTML 属性数据。还要注意不能包含其他格式的数据格式。例如,HTML->IFRAME->CSS->SVG。
【解决方案2】:

这是一个两步过程。首先,您需要使用这样的库来处理输入; http://msdn.microsoft.com/en-us/security/aa973814.aspx 。它将删除脚本标签和其他人们可能试图做恶意的偷偷摸摸的事情。

然后你需要显示原始输出。对于 Asp.Net MVC,它是 @Html.Raw(x=>x.SomePropertyThatIsHtml)。如果您使用其他东西,它应该有一个等价物来防止它被编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多