5

如果我有用户将数据输入富文本编辑器(微型编辑器)并提交我存储到数据库中的数据,然后检索以显示在其他动态网页上,为什么我需要在这里编码。

是因为有人可能将 javascript 粘贴到富文本编辑器中的唯一原因吗?还有其他原因吗?

4

9 回答 9

16

安全是原因。

最明显/最常见的原因是跨站点脚本(XSS)。事实证明,它是您可能在您的站点中看到的安全问题的根本原因。

跨站点脚本 (XSS) 是一种通常在 Web 应用程序中发现的计算机安全漏洞,它使恶意攻击者能够将客户端脚本注入其他用户查看的网页中。攻击者可以利用被利用的跨站脚本漏洞绕过同源策略等访问控制。截至 2007 年,在赛门铁克记录的所有安全漏洞中,大约 80% 是在网站上执行的跨站点脚本。1 根据易受攻击站点处理的数据的敏感性,它们的影响可能从轻微的麻烦到重大的安全风险,以及网站所有者实施的任何安全缓解措施的性质。

此外,如下面的评论所示,您的网站布局也可能被搞砸。

您需要Microsoft 反跨站点脚本库

更多资源

http://forums.asp.net/t/1223756.aspx

于 2010-05-26T16:26:50.790 回答
3

你犯了一些错误。

如果您从富文本编辑器接受 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,并在保存内容时维护严格的标签和属性白名单。

于 2010-05-26T16:29:34.593 回答
3

我认为您将“编码”与“擦洗”混淆了。

如果要接受来自用户的文本,则需要先将其编码为 HTML,然后再将其呈现为 HTML。这样,文本

a < b

被 HTML 编码为

a &lt; b

并在 HTML 浏览器中呈现(就像用户输入它一样):

a < b

如果您想接受来自用户的HTML(在这种情况下听起来就像您所做的那样),它已经是 HTML 格式,因此您不想再次调用 HTML.Encode。但是,您可能希望清除它以删除您不允许的某些标记(如脚本块)。

于 2010-05-26T16:43:40.190 回答
2

安全是主要原因。

于 2010-05-26T16:27:30.777 回答
2

用户不仅可以输入 javascript 代码或其他一些顽皮的东西,您还需要使用 HTML 编码才能在页面上显示某些字符。您不希望您的页面中断,因为您的数据库包含:“Nice Page :->”。

此外,如果您将代码输入数据库,请务必“清理”数据库的输入。

于 2010-05-26T16:27:47.373 回答
1

是的,如果有人将恶意字符串输入富文本编辑器,这是为了防止 JavaScript 执行。但是,纯文本 javascript 不是您唯一关心的问题,例如这是一个 XSS:

<IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>

在这里查看一系列不同的 XSS 选项;http://ha.ckers.org/xss.html

于 2010-05-26T16:31:23.823 回答
1

顺便说一句...... MVC2 已经实现了新功能,所以你不再需要调用 HTML.Encode

如果您更改视图语法

MVC 会自动为你编码。它使事情变得更容易/更快。同样,仅 MVC2

于 2010-05-26T16:33:34.660 回答
0

另一个原因是某些用户可以输入一些结束标签</div></table>并可能破坏您网站的布局。如果您使用的是 HTML 编辑工具,请确保生成的 html 有效,然后再将其嵌入页面而不进行编码。为了做到这一点,需要一些服务器端解析。您可以使用HtmlAgilityPack来执行此操作。

于 2010-05-26T16:33:25.723 回答
0

执行您的建议的主要原因是逃避您的输出。由于您接受 HTML 并希望输出它,因此您不能这样做。您需要做的是过滤掉用户可以做的不安全的事情,或者至少不是您想要的。

为此,让我建议AntiSamy

你可以在这里演示。

你正在做的事情有很多继承风险,你应该非常仔细地考虑。

于 2010-05-26T20:30:16.493 回答