HttpUtility.HtmlEncode,HttpUtility.HtmlDecode,AntiXSS库并正确格式化用户输入的输入

时间:2013-02-28 09:26:01

标签: c# asp.net .net xss

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

表格数据正在使用

进行编码
HttpUtility.HtmlEncode('It's my wedding!')

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

的数据库

这是我的婚礼!

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

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

说我然后使用:

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

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

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

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

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

你应该做些什么来安全地编码HTML并允许它在仍然阻止XSS攻击时显示?剥离/编码标签是否是唯一的解决方案?

以前每个人都处理过这个问题?

谢谢!

卡尔

2 个答案:

答案 0 :(得分:3)

好的,这就是我到达的解决方案。

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

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

答案 1 :(得分:2)

您是如何收到数据的?

假设ValidateRequest设置为true,.NET WebForms基础结构本身应该默认阻止很多这些事情。

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