HttpUtility.HtmlEncode、HttpUtility-HtmlDecode、AntiXSS库,并正确格式
本文关键字:格式 HtmlEncode HttpUtility-HtmlDecode AntiXSS HttpUtility | 更新日期: 2023-09-27 18:01:43
我正在尝试开发一个安全的web应用程序,它可以接受表单数据,将其编码到数据库中以消除跨站点脚本问题,然后在其他网页上很好地格式化它。
正在使用对表单数据进行编码
HttpUtility.HtmlEncode('It's my wedding!')
这种工作的一个例子是有人在文本框中输入"这是我的婚礼!"。这将进入格式化为的数据库
它';这是我的婚礼!
如果我把它从数据库中提取出来,并使用.NET文字控件显示它,它的显示方式与此完全相同,撇号仍在屏幕上编码。
网络浏览器解释&作为&符号和©;作为版权符号-为什么他们不解释代码';作为撇号?
说我然后使用:
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/,但由于用户无法修改其提供的白名单,它的质量和有效性似乎受到了可怕的评价。
您应该如何安全地对HTML进行编码并允许其显示,同时防止XSS攻击?剥离/编码标签是唯一的解决方案吗?
大家以前是怎么处理的?
谢谢!
Karl
好的,这是我得到的解决方案。
我想保护其他开发人员在不检查输出内容的情况下关闭请求验证和输出字段,所以我将使用HttpUtility.HtmlEncode方法对输入进行编码。这意味着,当其他开发人员吐出这些信息时,它仍然是编码的,如果他们希望轻松地将内容放入HttpUtility.HtmlDecode,那么这是他们的责任。
然而,我将构建一个方法,该方法只能转义我在用户输入中经常看到的最基本的格式,并且可以被认为是安全的。在我的例子中,这些字符是单引号和双引号。所有其他内容将保持编码。如果在现实生活中的用户输入或测试输入中出现了很多我没有解决的特定安全字符,我会回顾性地将其添加到白名单中。
您是如何接收数据的?
假设ValidateRequest
设置为true
,那么.NET WebForms基础结构本身在默认情况下应该阻止很多这样的事情。
当输出用户输入的数据时应使用HtmlEncode
(从而防止肮脏(。在这种情况下,HtmlDecode
不会来参加聚会。