ASP.Net防范XSS漏洞攻击的利器HtmlSanitizer

项目名称:HtmlSanitizer

NuGet安装指令:Install-Package HtmlSanitizer

官方网站:https://github.com/mganss/HtmlSanitizer 

开源协议:MIT

可靠程度:更新活跃,目前已经是3.x版,成熟靠谱。

 

1、  什么是XSS漏洞?

XSS漏洞又称为“跨站脚本”漏洞,指的是网站对于用户输入的内容不加甄别的原样又输出到了页面中,造成恶意代码被执行的漏洞。

比如A用户在发帖的时候在内容中写入了:<script>alert("您的账号有危险,请联系官方客服010-4444444")</script>这个电话其实不是官方的客服电话,而是A用户拥有的诈骗电话。如果网站把<script>alert("您的账号有危险,请联系官方客服010-4444444")</script>原样输出到网页中,那么其他用户打开帖子的时候就会弹出这样一个提示框,有的小白用户以为是官方弹出的提示,从而被骗。当然XSS漏洞的破坏方式还有其他的,比如写重定向代码把用户重定向到诈骗网站、绘制诈骗的登录表单窃取用户账号密码等。

2、  如何防范XSS漏洞?

ASP.net非常贴心的帮我们做了XSS漏洞的防范,无论是ASP.Net WebForm还是ASP.Net MVC,当用户提交的表单中含有疑似html标签的内容的时候框架直接就会报错“从客户端中检测到有潜在危险的值”,这样程序员根本不用操心刻意去防范。

那么我们为什么还要考虑XSS漏洞防范呢?因为在有一些场合下,还是需要允许浏览器提交带有html标签的内容的。比如如鹏网的新闻评论区:


         这里允许用户发链接、发图片、设置字体颜色、画table等复杂的格式控制,这些内容都是Html格式表达最方便。有的项目中是使用UBBMarkDown等转义的方案,但是都没有允许用户写html最强大、灵活。现在主流的Html在线编辑器,比如UEditorKindEditor等也都是输出成html内容。因此必须允许我们把这些html内容提交给服务器。

3、  如何禁用ASP.NetValidateRequest

要“允许我们把这些html内容提交给服务器”,就要禁用“自动XSS检测”,也就是关闭ValidateRequest。无论是ASP.Net WebForm,还是ASP.Net MVC中,都有关掉.Net的“自动XSS检测”的方法。

由于ASP.Net MVC的必然崛起,ASP.Net WebForm业内不推荐使用了,在如鹏网的.Net培训课程中也把ASP.Net WebForm删掉了,因此这里就不再浪费时间介绍如何在ASP.Net WebForm禁用“自动XSS检测”,感兴趣的可以搜索一下“ASP.Net WebForm 禁用ValidateRequest”。

下面我只介绍在ASP.Net MVC中如何禁用ValidateRequest,很简单,只要在Action方法上标注[ValidateInput(false)]即可。比如

[ValidateInput(false)]

public ActionResult Test()

{

}

4、  如何避免XSS漏洞?

一旦禁用“自动XSS检测”,咱们的系统又陷入了危险之中。如何即允许用户提交html,又避免用户提交有潜在危险的html代码呢?HtmlSanitizer给出了很好的解决方案:设置不危险的“标签、属性”白名单,把所有不在白名单中的“标签、属性”全部干掉。

         下面是例子代码:

var sanitizer = new HtmlSanitizer();

var html = @"<SCRIPT>alert('xss')</script><div οnlοad=""alert('xss')"""

+ @"style=""background-color: test"">Test<img src=""test.gif"""

+ @"style=""background-image: url(javascript:alert('xss')); margin: 10px""></div>";

html = sanitizer.Sanitize(html);

         输出一下html你就会发现它变成了:

<div style="background-color: test">Test<img src="test.gif" style="margin: 10px"></div>

 

         很显然,那些危险的<script>标签、onload事件都被删除掉了,甚至这种潜在的危险都能过滤掉:background-image: url(javascript:alert('xss'))

         而无害的标签、样式、属性则被保留了下来。

5、  细节问题:

1)  form表单也会引起潜在的危险,但是HtmlSanitizer默认是允许form标签的,因此要禁用掉,只要执行sanitizer.AllowedTags.Remove("form");form表单从“标签白名单”中移除即可。其他你不想允许的标签也可以通过这种方法移除。具体有哪些白名单可以从HtmlSanitizer的官网看到。HtmlSanitizer类的AllowedAttributesAllowedCssPropertiesAllowedTags分别是“标签属性白名单”、“CSS属性白名单”、“标签白名单”。

2)  HtmlSanitizer会对html做正规化修正以保证更符合Html标准,因此并不会原样输出,比如4 < 5这种不规范的写法会被处理成4 &lt; 5,<SPAN>test</p>这种不规范的写法会被处理成<span>test<p></p></span>

3)  HtmlSanitizer依赖于AngleSharp这个开源库做html的解析,因此如果用的时候存在一些bug,可以尝试升级一下AngleSharp库;

原文地址:http://bbs.rupeng.com/Post/Index/4084


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个人借款合同范本

甲方&#xff08;借款人&#xff09;&#xff1a;_________________ 身份证号码&#xff1a;_____________________ 乙方&#xff08;贷款人&#xff09;&#xff1a;_________________ 身份证号码&#xff1a;______________________ 甲乙双方就借款事宜&#xff0c;在平等…

Mybatis中使用Dao实现类实现增删改查【实际开发中使用代理dao】

在Mybatis开发中&#xff0c;使用到的是代理Dao的方式实现增删改查&#xff0c;这样就不需要在写Dao的实现类 但是Mybatis也支持写Dao实现类&#xff01;即DaoImpl 直接上DaoImpl&#xff0c;之前的代码可以参考前面几篇文章。 DaoImpl类 package com.itheima.dao.impl;impor…

阿里巴巴制定了这 16 条

转载自 阿里巴巴制定了这 16 条 本文内容整理自《阿里巴巴Java开发手册 1.4.0》&#xff0c;获取完整版请在公众号后台回复关键字&#xff1a;手册。 1、【强制】存储方案和底层数据结构的设计获得评审一致通过&#xff0c;并沉淀成为文档。 说明&#xff1a;有缺陷的底层数…

中英文输入

一、鼠标&#xff1a; 1.是一种输入设备。 2.主要包括&#xff1a;左键&#xff0c;滑轮&#xff0c;右键。 3.常用的操作&#xff1a;移动&#xff0c;单击&#xff0c;双击&#xff0c;右击&#xff0c;拖拽。 二、键盘&#xff1a; 1.输入设备。 2.常用的键盘分为&#xff1…

JS中数组的常用方法

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script type"text/javascript">//创建一个数组var arr ["孙悟空","猪八戒","沙和尚"];/** push()* - 该方…

使用 Docker 让传统 .NET 应用程序现代化

15 年来&#xff0c;Microsoft .NET Framework 一直都是成功的应用程序平台&#xff0c;在旧版 Framework 和旧版 Windows Server 上运行的业务关键应用程序不计其数。这些传统应用程序仍具有很大的业务价值&#xff0c;但其维护、升级、扩展和管理难度可能很大。同样&#xff…

Mybatis中properties标签的使用

作用域&#xff1a;主配置文件SqlMapConfig.xml中 第一种写法&#xff01; value值使用${properties中property中name} 第二种写法&#xff1a; 创建文件&#xff1a;jdbcConfig.properties jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/ee42 jd…

word文档编辑

一、微软公司office系列的产品之一。 二、一个文字处理的应用程序。 三、启动word: 右击–》新建–》word2007 四、word的界面&#xff1a; 1.文件选项卡 2.功能选项卡 3.标题栏 4.功能面板 5.文档编辑区 6.状态栏 7.滚动条 五、常用的快捷键&#xff1a; 1.保存&#xff1a;ct…

Spring Boot 配置加载顺序详解

转载自 Spring Boot 配置加载顺序详解 使用 Spring Boot 会涉及到各种各样的配置&#xff0c;如开发、测试、线上就至少 3 套配置信息了。Spring Boot 可以轻松的帮助我们使用相同的代码就能使开发、测试、线上环境使用不同的配置。 在 Spring Boot 里面&#xff0c;可以使…

JS中遍历数组的两种方式

方式一 for循环 //遍历arr&#xff0c;获取arr中Person对象for(var i0 ; i<arr.length ; i){var p arr[i];//判断Person对象的age是否大于等于18if(p.age > 18){//如果大于等于18&#xff0c;则将这个对象添加到newArr中//将对象放入到新数组中newArr.push(p);}}方式二…

.NET的一点历史故事:作者的一些感想

最近几天通过微博的头条文章平台公开连载了《.NET的一点历史故事》一书的部分草稿。不论是书名还是章节内容&#xff0c;目前真的是仅仅草稿阶段。所以这么早就以连载的方式发布出来&#xff0c;一方面是正在准备在蒙特利尔这边微软技术圈的两场演讲&#xff0c;需要自己尽快恢…

Excel电子表格操作

一、Dos命令才常用的操作&#xff1a; 1.打开Dos窗口&#xff1a;winr 2.切换盘符&#xff1a;直接写盘符&#xff1a; eg: d: 3.新建文件夹&#xff1a;md 文件夹名 4.进入文件夹&#xff1a;cd 文件夹名 5.返回上一级目录&#xff1a;cd… 6.查找本机ip地址&#xff1a;ipcon…

Mybatis中typeAliases标签和package标签

1、typeAliases 主配置文件&#xff1a; <typeAliases><typeAlias type"com.itheima.domain.User" alias"user"></typeAlias></typeAliases>映射配置文件&#xff1a; 2、package 主配置文件<typeAliases><!--<t…

我是怎么把一个项目带崩的

转载自 我是怎么把一个项目带崩的 我是一名项目经理&#xff0c;在过去的四个月里&#xff0c;我把一个项目带崩了&#xff08;上线后频出问题&#xff0c;用户无法使用&#xff09;。在最近的几天&#xff0c;我每天都在反思自己&#xff0c;我都在问自己以下几个问题&…

JS中数组去重

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script type"text/javascript">//创建一个数组var arr [1,2,3,2,2,1,3,4,2,5];//去除数组中重复的数字//获取数组中的每一个元素for(var i…

PPT 2010实现使用自定义主题付下载

直接入主题&#xff0c;首先我们打开PPT2010&#xff0c;如下图所示&#xff1a; 点击设计&#xff0c;找到浏览主题&#xff1a; 然后找到我们需要的主题&#xff0c;我已经整理了常用的40套&#xff1a; 最后完美更改

Mybatis中连接池介绍

连接池&#xff1a;我们在实际开发中都会使用连接池。以为它可以减少我们获取连接所消耗的时间mybatis中的连接池mybatis连接池提供了三种方式的配置&#xff0c;配置位置主配置文件SqlMapConfig.xml中的dataSource标签&#xff0c;type属性就是标识采用何种连接池方式type属性…

【深圳】.NET 技术分享交流会

随着微软Build 2017的召开&#xff0c;预期将发布.NET Core 2.0 Preview, 邀请深圳地区.NET技术专家和从业人员&#xff0c;一起分享与交流.NET 技术的发展方向,提高.NET技术氛围&#xff0c;发掘.NET高级人才&#xff0c;为改善.NET生态贡献一份力&#xff0c;使.NET技术在深圳…

JS数组中的剩余方法

<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><script type"text/javascript">var arr ["孙悟空","猪八戒","沙和尚"];var arr2 ["白骨精",…

分布式作业 Elastic Job 如何动态调整

转载自 分布式作业 Elastic Job 如何动态调整 前面分享了两篇分布式作业调度框架 Elastic Job 的介绍及应用实战。 ElasticJob&#xff0d;分布式作业调度神器 分布式作业 Elastic Job 快速上手指南 Elastic Job 提供了简单易用的运维平台&#xff0c;方便用户监控、动态修…