如果我有一个用户将数据输入到富文本编辑器(小编辑器)并将数据存储到数据库中然后检索以显示在其他动态网页上,为什么我需要在这里进行编码。
唯一的原因是因为有人可能会将javascript粘贴到富文本编辑器中吗?还有其他原因吗?
答案 0 :(得分:16)
安全是原因。
最明显/常见的原因是 Cross-Site-Scripting (XSS)。事实证明,这是您在网站上可能遇到的安全问题的根本原因。
跨站点脚本(XSS)是一种类型 计算机安全漏洞 通常在Web应用程序中找到 使恶意攻击者能够 将客户端脚本注入Web 其他用户查看的页面。一个 利用跨站点脚本 漏洞可以被攻击者使用 绕过访问控制,如 同源政策。跨站点 在网站上进行的脚本编写是 大约80%的安全性 Symantec记录的漏洞 截至2007年。1他们的影响范围可能很大 从轻微的滋扰到重要的 安全风险,取决于 由...处理的数据的敏感性 易受攻击的网站,以及任何性质 安全缓解措施 该网站的所有者。
另外,如下面的评论所示,您的网站布局也可能搞砸了。
您需要 Microsoft Anti-Cross Site Scripting Library
更多资源
答案 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 < 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=javascript:alert('XSS')>
在这里查看一系列不同的XSS选项; http://ha.ckers.org/xss.html
答案 6 :(得分:1)
作为一个...... MVC2已经实现了新功能,因此您不再需要调用HTML.Encode
如果您从
更改视图语法到
MVC会自动为您编码。它使事情变得更容易/更快。同样,仅MVC2
答案 7 :(得分:0)
另一个原因是某些用户可能会输入一些结束标记</div></table>
并可能会破坏您网站的布局。
如果您使用的是HTML编辑工具,请确保生成的html在将其嵌入页面而不进行编码之前是有效的。为了做到这一点,需要一些服务器端解析。您可以使用HtmlAgilityPack执行此操作。
答案 8 :(得分:0)