3

我正在尝试开发一个安全的 Web 应用程序,它可以接受表单数据,将其编码到数据库中以消除跨站点脚本问题,然后在其他网页上很好地格式化它。

表单数据正在使用编码

HttpUtility.HtmlEncode('It's my wedding!')

这种工作的一个例子是有人输入“这是我的婚礼!” 进入一个文本框。这将进入格式化为的数据库:

这是我的婚礼!

如果我随后将其从数据库中拉出并使用 .NET 文字控件显示它,它的显示方式与此完全一样,撇号仍然在屏幕上进行编码。

Web 浏览器将 & 解释为 & 符号,将 © 解释为版权符号 - 他们为什么不将代码 ' 解释为撇号?

说我然后使用:

HttpUtility.HtmlDecode('It's my wedding!');

这将解决我的撇号问题,但是如果我在有人设法将恶意 javascript 注入此字段时使用 HtmlDecode 方法,例如:

It's my wedding!<script type="text/javascript">alert('XSS!');</script>

它还将解码编码的 javascript,然后执行攻击。如果是这种情况,为什么我们首先使用 HttpUtility.HtmlEncode() ?

我在http://wpl.codeplex.com/看到有人使用 Microsoft AntiXss 库,但由于用户无法修改它提供的白名单,它似乎收到了关于其质量和有效性的可怕评论。

你应该怎么做才能安全地编码 HTML 并允许它显示同时仍然防止 XSS 攻击?剥离/编码标签是唯一的解决方案吗?

大家以前是怎么处理的?

谢谢!

卡尔

4

2 回答 2

3

好的,这就是我得出的解决方案。

我想保护其他开发人员在不检查他们正在输出的内容的情况下关闭请求验证和输出字段,因此我将使用 HttpUtility.HtmlEncode 方法对输入进行编码。这意味着当其他开发人员吐出这些信息时,它仍然是经过编码的,如果他们希望将内容轻松地扔到 HttpUtility.HtmlDecode 中,那么这是他们的责任。

但是,我将构建一种方法,该方法能够仅转义我在用户输入中经常看到的最基本的格式,这些格式可以被解释为安全的。在我的例子中,这些字符是单引号和双引号。所有其他内容将保持编码状态。如果在现实生活中的用户输入或测试输入中出现了很多我没有解决的特定安全字符,我会追溯将其添加到白名单中。

于 2013-04-09T10:57:15.660 回答
2

你是如何接收数据的?

无论如何,.NET WebForms 基础结构本身应该默认阻止很多这些东西,假设ValidateRequest设置为true.

HtmlEncode应该在输出用户输入的数据时使用(从而防止肮脏)。HtmlDecode在这种情况下不来参加聚会。

于 2013-03-02T00:06:08.080 回答