如何正确保护 asp.net 核心 3.1 应用免受 XSS 攻击并使用 @Html.Raw() 显示 HTML

How to properly secure asp.net core 3.1 app from XSS attack and display HTML using @Html.Raw()

我有一个 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 字符串输出。

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

https://github.com/mganss/HtmlSanitizer

它在 Nuget 上可用:

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

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