如果我有用户将数据输入富文本编辑器(微型编辑器)并提交我存储到数据库中的数据,然后检索以显示在其他动态网页上,为什么我需要在这里编码。
是因为有人可能将 javascript 粘贴到富文本编辑器中的唯一原因吗?还有其他原因吗?
如果我有用户将数据输入富文本编辑器(微型编辑器)并提交我存储到数据库中的数据,然后检索以显示在其他动态网页上,为什么我需要在这里编码。
是因为有人可能将 javascript 粘贴到富文本编辑器中的唯一原因吗?还有其他原因吗?
安全是原因。
最明显/最常见的原因是跨站点脚本(XSS)。事实证明,它是您可能在您的站点中看到的安全问题的根本原因。
跨站点脚本 (XSS) 是一种通常在 Web 应用程序中发现的计算机安全漏洞,它使恶意攻击者能够将客户端脚本注入其他用户查看的网页中。攻击者可以利用被利用的跨站脚本漏洞绕过同源策略等访问控制。截至 2007 年,在赛门铁克记录的所有安全漏洞中,大约 80% 是在网站上执行的跨站点脚本。1 根据易受攻击站点处理的数据的敏感性,它们的影响可能从轻微的麻烦到重大的安全风险,以及网站所有者实施的任何安全缓解措施的性质。
此外,如下面的评论所示,您的网站布局也可能被搞砸。
更多资源
你犯了一些错误。
如果您从富文本编辑器接受 HTML 格式的文本,则不能调用Html.Encode
,否则它将对所有 HTML 标记进行编码,您将看到原始标记而不是格式化文本。
但是,您仍然需要防范 XSS。
换句话说,如果用户输入以下 HTML:
<b>Hello!</b>
<script>alert('XSS!');</script>
您想保留<b>
标签,但删除(而不是编码)<script>
标签。
同样,您需要删除内联事件属性(如onmouseover
)和 Javascript URL(如<a href="javascript:alert('XSS!');>Dancing Bunnies!</a>
)
您应该通过严格的 XML 解析器运行用户的 HTML,并在保存内容时维护严格的标签和属性白名单。
我认为您将“编码”与“擦洗”混淆了。
如果要接受来自用户的文本,则需要先将其编码为 HTML,然后再将其呈现为 HTML。这样,文本
a < b
被 HTML 编码为
a < b
并在 HTML 浏览器中呈现(就像用户输入它一样):
a < b
如果您想接受来自用户的HTML(在这种情况下听起来就像您所做的那样),它已经是 HTML 格式,因此您不想再次调用 HTML.Encode。但是,您可能希望清除它以删除您不允许的某些标记(如脚本块)。
安全是主要原因。
用户不仅可以输入 javascript 代码或其他一些顽皮的东西,您还需要使用 HTML 编码才能在页面上显示某些字符。您不希望您的页面中断,因为您的数据库包含:“Nice Page :->”。
此外,如果您将代码输入数据库,请务必“清理”数据库的输入。
是的,如果有人将恶意字符串输入富文本编辑器,这是为了防止 JavaScript 执行。但是,纯文本 javascript 不是您唯一关心的问题,例如这是一个 XSS:
<IMG SRC=javascript:alert('XSS')>
在这里查看一系列不同的 XSS 选项;http://ha.ckers.org/xss.html
顺便说一句...... MVC2 已经实现了新功能,所以你不再需要调用 HTML.Encode
如果您更改视图语法
到
MVC 会自动为你编码。它使事情变得更容易/更快。同样,仅 MVC2
另一个原因是某些用户可以输入一些结束标签</div></table>
并可能破坏您网站的布局。如果您使用的是 HTML 编辑工具,请确保生成的 html 有效,然后再将其嵌入页面而不进行编码。为了做到这一点,需要一些服务器端解析。您可以使用HtmlAgilityPack来执行此操作。