为什么我需要做html.encode()
-
04-10-2019 - |
题
如果我有一个用户将数据输入到丰富的文本编辑器(小编辑器)中,并提交了我存储在数据库中的数据,然后检索以在其他动态网页上显示,为什么我需要在此处编码。
是唯一的原因,因为有人会粘贴javascript到丰富的文本编辑器中?还有其他原因吗?
其他提示
您正在犯一些错误。
如果您接受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 < b
并在HTML浏览器(用户输入时)呈现为:
a < b
如果你想接受 html 从用户(在这种情况下听起来像您这样做),它已经采用HTML格式,因此您不想再次致电html.encode。但是,您可能需要擦洗它以删除您不允许的某些标记(例如脚本块)。
安全是主要原因。
用户不仅可以输入JavaScript代码或其他一些nudrionsion,还需要使用HTML编码以在页面上显示某些字符。您不希望您的页面中断,因为您的数据库包含:“不错的页面: - >”。
另外,如果您将代码输入到数据库中,请确保“对”数据库的输入“清理”。
是的,这是为了防止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 去做这个。