我们正在开发一个应用程序,它将用户输入作为Html并在不同页面中呈现与输出相同的Html。并且输入应该永远不会像脚本标记那样具有任何动态行为。
我们Html在Javascript中编码值并将编码值保存在DB中。我们Html解码保存的值并在新页面中呈现它以获得预期的结果(请查看下面的示例)。
从我到目前为止所读到的内容来看,我应该在输入之前对输入进行Html编码,然后将其作为输出显示在不同的页面中。我面临的问题是,无论用户添加的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攻击。我从微软那里经历了AntiXSS框架,他们更多的是剥离任何有害的HTML和编码。它们无助于让用户知道他们不应该输入一些标签。
感谢您提前提供任何帮助。
答案 0 :(得分:0)
如果用户输入是HTML,并且在保存之前对其进行编码,那么当您显示它时,您应该对其进行解码。
建议在显示之前进行编码的原因是,如果用户输入应该是文本,建议编码用于一般显示目的(以便将&符实际显示为&
)并且还要防止在页面上呈现并由浏览器解释的潜在恶意输入(例如<script>
标签)。
请小心:如果您打算显示用户提供的HTML,您尝试尽可能多地清理输入 - 请确保他们不会尝试做任何恶意的事情,并确保他们不会犯一个可能破坏网页整个布局的简单错误(例如,有一个没有结束标记的开始标记)。这种类型的卫生设施不是一项简单的任务,也是首先存在其他标记风格的主要因素之一(例如Mark Down,BBCode等)。
答案 1 :(得分:0)
@Brian Ball回答了这个问题,但我认为有必要作进一步的解释。
许多不同的编码协议是特定于上下文的。
据我了解,HTMLencoding(与其他编码协议(如URIencoding等)相反)的唯一目的是允许浏览器按原样呈现文本,前提是该文本包含否则将被解析为HTML的元素(例如,字符&<> /以及双引号和单引号)。结束编码从浏览器的HTML解析器中“隐藏”这些字符。
因此,真正实现HTMLencoding唯一目的的地方就是准备要由浏览器呈现的文本。 HTMLencoding进入数据库的用户输入文本没有任何目的。您可能需要使用其他编码进行传输,以确保通过服务器端语言等进行适当的处理,但是HTMLencoding在这些上下文中没有位置。
在您所处的情况下,事实是您先前对内容进行了HTML编码,从而阻止了以后在从数据库中检索内容时将其呈现为HTML。编码完全按照其意图进行。
所以简单的答案是,
a。在将用户输入的数据保存到数据库之前,没有必要对它们进行HTML编码,并且 b。如果您希望将其呈现为HTML 而不是按原样打印到屏幕上,请不要在将其显示在另一页上时对其进行HTML编码。