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

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

有帮助吗?

解决方案

安全是原因。

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

跨站点脚本(XSS)是一种通常在Web应用程序中找到的计算机安全漏洞,使恶意攻击者能够将客户端脚本注入其他用户查看的网页。攻击者可以使用被剥削的跨站点脚本漏洞绕过访问控件,例如相同的原点策略。截至2007年,在网站上进行的跨站点脚本大约是Symantec记录的所有安全漏洞的80%。1 它们的影响可能从琐碎的滋扰到严重的安全风险,具体取决于易受伤害站点处理的数据的敏感性,以及该网站所有者实施的任何安全缓解的性质。

另外,如下注释所示,您网站的布局也可以拧紧。

你需要 Microsoft反交叉网站脚本库

更多资源

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

其他提示

您正在犯一些错误。

如果您接受Rich-Text编辑器的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 &lt; b

并在HTML浏览器(用户输入时)呈现为:

a < b

如果你想接受 html 从用户(在这种情况下听起来像您这样做),它已经采用HTML格式,因此您不想再次致电html.encode。但是,您可能需要擦洗它以删除您不允许的某些标记(例如脚本块)。

安全是主要原因。

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

另外,如果您将代码输入到数据库中,请确保“对”数据库的输入“清理”。

是的,这是为了防止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

顺便说一句..... MVC2已实施了新功能,因此您不再需要致电html.encode

如果您从中更改视图语法

MVC将自动为您编码。它使事情变得更容易/更快。再次,仅MVC2

另一个原因是某些用户可以输入一些关闭标签 </div></table> 并有可能打破您网站的布局。如果您使用的是HTML编辑工具,请确保生成的HTML在不编码的情况下将其嵌入页面之前是有效的。为此,需要一些服务器端解析。您可以使用 htmlagilitypack 去做这个。

做您建议的事情的主要原因是逃避输出。由于您接受HTML并希望输出它,因此无法做到这一点。您需要做的是过滤用户可以做的事情,或者至少不是您想要的。

为此,让我建议 反萨米.

你可以演示 这里.

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top