为什么我需要做html.encode()

时间:2010-05-26 16:24:18

标签: asp.net-mvc encoding html.encode

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

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

9 个答案:

答案 0 :(得分:16)

安全是原因。

最明显/常见的原因是 Cross-Site-Scripting (XSS)。事实证明,这是您在网站上可能遇到的安全问题的根本原因。

  

跨站点脚本(XSS)是一种类型   计算机安全漏洞   通常在Web应用程序中找到   使恶意攻击者能够   将客户端脚本注入Web   其他用户查看的页面。一个   利用跨站点脚本   漏洞可以被攻击者使用   绕过访问控制,如   同源政策。跨站点   在网站上进行的脚本编写是   大约80%的安全性   Symantec记录的漏洞   截至2007年。1他们的影响范围可能很大   从轻微的滋扰到重要的   安全风险,取决于   由...处理的数据的敏感性   易受攻击的网站,以及任何性质   安全缓解措施   该网站的所有者。

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

您需要 Microsoft Anti-Cross Site Scripting Library

更多资源

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

答案 1 :(得分: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,并在保存内容时维护严格的标签和属性白名单。

答案 2 :(得分:3)

我认为你将“编码”与“擦洗”混为一谈。

如果您想接受用户的 text ,则需要在将其呈现为HTML之前将其编码。这样,文字

a < b

是HTML编码为

a &lt; b

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

a < b

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

答案 3 :(得分:2)

安全是主要原因。

答案 4 :(得分:2)

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

另外,如果要将代码输入数据库,请务必对数据库的输入进行“sanatize”。

答案 5 :(得分: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

答案 6 :(得分:1)

作为一个...... MVC2已经实现了新功能,因此您不再需要调用HTML.Encode

如果您从

更改视图语法
  

  

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

为此,我建议AntiSamy

您可以演示它here

你在做什么有很多遗传风险,你应该仔细考虑。