我应该对用户输入的HTML HTML进行编码吗?

问题描述 投票:0回答:2

我们正在开发一个应用程序,该应用程序将用户输入作为HTML并在另一个页面中将相同的HTML呈现为输出。并且输入中不应像脚本标签那样具有任何动态行为。

我们使用HTML对值进行编码,然后将编码后的值保存在DB中。我们将保存的值解码并在新页面中呈现,以得到预期的结果(请检查以下示例)。

根据目前为止我所读的内容,我应该先对输入进行编码,然后再将其呈现为另一页中的输出。我面临的问题是,无论用户添加的HTML内容在新页面中的显示如何,都是相同的

示例:

用户输入

<div><h2>Header</h2><p>this is the body text</p></div>

当HTML编码并将其分配给另一个div时,在新页面中输出:

<div><h2>Header</h2><p>this is the body text</p></div>

期望:

   Header
   this is the body text

我能够获得预期结果的唯一方法是当我的HTML解码保存的值并将其分配给另一个容器控件时。

如果我丢失了某些东西,我尝试了所有我了解的HTML方式,对用户输入进行编码并将其呈现回去并没有达到预期的效果。关于如何实现这一目标的任何想法?

如果没有其他解决方案,.net中是否有任何可用的验证框架来避免XSS攻击。我已经通过了Microsoft的AntiXSS框架,它们更多地用于剥离任何有害的html和编码。它们无助于让用户知道他们不应输入某些标签。

感谢您的任何帮助。

xss html-encode
2个回答
0
投票

如果用户输入是HTML,并且在保存之前对其进行了编码,那么在显示时,应该对其进行解码。

建议在显示之前进行编码的原因是,如果预期用户输入为文本,建议出于常规显示目的进行编码(这样,“与”号实际上会显示为&),并且还可以防止潜在的恶意输入从页面上呈现并由浏览器解释(例如<script>标签)。

[请注意:如果您打算显示由用户提供的HTML,并且您试图尽可能地清理输入内容-请确保他们没有试图进行任何恶意操作,并且确保他们不会犯一个简单的错误,而该错误可能会破坏网页的整个布局(例如,带有开始标记而没有结束标记)。这种环境卫生不是一项简单的任务,而是首先要存在其他标记风格(例如Mark DownBBCode等)的主要因素之一。


0
投票

@@ Brian Ball已回答了问题,但我认为有必要作进一步的解释。

许多不同的编码协议是特定于上下文的。

据我了解,HTMLencoding的唯一要点(与URIencoding等其他编码协议相反)是允许浏览器按原样呈现文本,前提是该文本包含否则将被解析为HTML的元素(例如,字符&<> /以及双引号和单引号)。结束编码从浏览器的HTML解析器中“隐藏”这些字符。

实际上,HTMLencoding唯一可用于任何目的的地方就是准备要由浏览器呈现的文本。 HTMLencoding前往数据库的用户输入文本没有任何目的。您可能需要使用其他编码进行传输,以确保通过服务器端语言等进行适当的处​​理,但是HTMLencoding在这些上下文中没有位置。

根据您的情况,事实上,您先前对内容进行了HTML编码,从而阻止了以后在从数据库中检索内容时将其呈现为HTML。编码完全按照其意图进行。

所以简单的答案是,

a。在将用户输入的数据保存到数据库之前,没有必要对它们进行HTML编码,并且b。如果您希望它渲染为HTML而不是“按原样”打印到屏幕上,请不要在将其显示在另一页上时对其进行HTML编码。

© www.soinside.com 2019 - 2024. All rights reserved.