【发布时间】:2020-07-10 02:14:13
【问题描述】:
我有一个Asp.Net Core 3.1 剃须刀页面应用程序。我收到了来自用户的HTML 内容,这些内容将显示在浏览器中。这是一种类似于博客的应用程序,我的最终用户将获得一个WYSIWYG 编辑器,然后来自用户的HTML 将被编码并保存在数据库中。
现在,当请求博客页面时,我需要将HTML 内容解码并在浏览器中显示。这使我的网站容易受到XSS 攻击。
这是我来自用户的HTML,
<p>blog 5</p><script>alert()</script>
我对此进行编码并保存在数据库中,
<p>blog 5</p><script>alert()</script>
现在渲染相同,
@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