【问题标题】:How to properly secure asp.net core 3.1 app from XSS attack and display HTML using @Html.Raw()如何正确保护 asp.net core 3.1 应用程序免受 XSS 攻击并使用 @Html.Raw() 显示 HTML
【发布时间】:2020-07-10 02:14:13
【问题描述】:

我有一个Asp.Net Core 3.1 剃须刀页面应用程序。我收到了来自用户的HTML 内容,这些内容将显示在浏览器中。这是一种类似于博客的应用程序,我的最终用户将获得一个WYSIWYG 编辑器,然后来自用户的HTML 将被编码并保存在数据库中。

现在,当请求博客页面时,我需要将HTML 内容解码并在浏览器中显示。这使我的网站容易受到XSS 攻击。

这是我来自用户的HTML

<p>blog 5</p><script>alert()</script>

我对此进行编码并保存在数据库中,

&lt;p&gt;blog 5&lt;/p&gt;&lt;script&gt;alert()&lt;/script&gt;

现在渲染相同,

@Html.Raw(System.Net.WebUtility.HtmlDecode(Model.Blog.Content))

当页面被渲染时,它会显示 javascript alert() 框。

如果我不解码,则显示 html 字符串,

@Html.Raw(Model.Blog.Content)

如下图,

<p>blog 5</p><script>alert()</script>

我很困惑。我在这里做错了吗?请协助并纠正我。我需要 html 是安全的,而且它必须在浏览器中显示为 html 而不是 html 字符串输出。

【问题讨论】:

  • 没有任何 Web 框架可以轻松解决这个问题。考虑到不同编码方案的数量,您需要清理用户输入,这几乎是不可能的。这就是为什么大多数网站(如 StackOverflow)不允许不受约束的 HTML 而是支持像 Markdown 这样的子集。
  • 所以更好的方法是使用基于 Markdown 的编辑器?
  • Markdown 编辑器肯定比接受原始 HTML 更好,但您仍然需要放入安全防护。我想我已经看过一些关于信任用户输入的博客文章。谷歌一下,我相信你会找到很多。

标签: xss razor-pages asp.net-core-3.1


【解决方案1】:

我建议使用 HTML sanitizer 库。 .NET 中比较流行的一种是:

https://github.com/mganss/HtmlSanitizer

它在 Nuget 上可用:

https://www.nuget.org/packages/HtmlSanitizer/

这将允许您将要允许的标签列入白名单。有关其他文档和示例,请参阅 wiki。

【讨论】:

  • 这看起来很棒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多