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格式表达最方便。有的项目中是使用UBB、MarkDown等转义的方案,但是都没有允许用户写html最强大、灵活。现在主流的Html在线编辑器,比如UEditor、KindEditor等也都是输出成html内容。因此必须允许我们把这些html内容提交给服务器。
3、 如何禁用ASP.Net的ValidateRequest
要“允许我们把这些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类的AllowedAttributes、AllowedCssProperties、AllowedTags分别是“标签属性白名单”、“CSS属性白名单”、“标签白名单”。
2) HtmlSanitizer会对html做正规化修正以保证更符合Html标准,因此并不会原样输出,比如4 < 5这种不规范的写法会被处理成4 < 5,<SPAN>test</p>这种不规范的写法会被处理成<span>test<p></p></span>
3) HtmlSanitizer依赖于AngleSharp这个开源库做html的解析,因此如果用的时候存在一些bug,可以尝试升级一下AngleSharp库;
原文地址:http://bbs.rupeng.com/Post/Index/4084
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
ASP.Net防范XSS漏洞攻击的利器HtmlSanitizer相关推荐
- 网站安全之XSS漏洞攻击以及防范措施
在网站开发中,安全问题是重中之重的问题,特别像一个sql注入,XSS漏洞攻击,等的防范,如果不做好,网站将存在很大的隐患 XSS漏洞是网站漏洞中最容易出现的一种,至少现在的各大网站中基本都存在,传闻只 ...
- php的服务器变量$SERVER以及防止$_SERVER['PHP_SELF']造成的XSS漏洞攻击及其解决方案
一.背景 突然想起来之前面试的一些面试题,让我写出几个服务器变量$SERVER代表的意思..实话实说,这些东西已经忘记很久了,都是用的时候直接上网查,今天再复习复习吧. 二.$SERVER $_SER ...
- java前端提示反射型xss_解决反射型XSS漏洞攻击
1 /* 2 * Copyright (C), 2001-2019, xiaoi机器人3 * Author: han.sun4 * Date: 2019/2/28 11:395 * History:6 ...
- 防止XSS漏洞攻击常用解决方案
漏洞通用描述 跨站脚本攻击(Cross Site Scripting),简称XSS漏洞. 该页面直接将用户在 HTML 页面中的输入(通常是参数值)加载到前端页面,没有预先加以清理. 如果脚本在响应页 ...
- 新浪微博的XSS漏洞攻击过程详解
今天晚上(2011年6月28日),新浪微博出现了一次比较大的XSS攻击事件.大量用户自动发送诸如:"郭美美事件的一些未注意到的细节","建 党大业中穿帮的地方" ...
- 使用AntiSamy防范XSS跨站脚本攻击
0x00 什么是XSS? XSS(Cross Site Scripting),即跨站脚本攻击,是一种常见于web application中的计算机安全漏洞.XSS通过在用户端注入恶意的可运行脚本,若服 ...
- 跨站脚本攻击之反射型XSS漏洞【转载】
转载自FovWeb.com 如果一个WEB应用程序使用动态页面传递参数向用户显示错误信息,就有可能会造成一种常见的XSS漏洞.一般情况下,这种页面使用一个包含消息文本的参数,并在页面加载时将文本返回给 ...
- XSS跨站脚本攻击实例讲解,新浪微博XSS漏洞过程分析
2011年6月28日晚,新浪微博遭遇到XSS蠕虫攻击侵袭,在不到一个小时的时间,超过3万微博用户受到该XSS蠕虫的攻击.此事件给严重依赖社交网络的网友们敲响了警钟.在此之前,国内多家著名的SNS网站和 ...
- java反射行跨站脚本攻击_跨站脚本攻击之反射型XSS漏洞【转载】
如果一个WEB应用程序使用动态页面传递参数向用户显示错误信息,就有可能会造成一种常见的XSS漏洞.一般情况下,这种页面使用一个包含消息文本的参数,并在页面加载时将文本返回给用户.对于开发者来说,使用这 ...
最新文章
- 功率半导体碳化硅(SiC)技术
- java每日小算法(22)
- oracle locked timed,Oracle里面的用户smsdb无法登录 LOCKED(TIMED)
- 智能家居中语音识别算法研究_语音识别研究获进展
- 微波网络归一化转移矩阵[a]导出散射矩阵[S]
- 单链表java实现及相关操作(版本1)
- Luogu4074[WC2013] 糖果公园
- java的mergesort函数_MergeSort -- 归并排序
- Echarts 三维地图
- mysql 免安装版安装
- 2008年高考数学江西卷压轴题
- warning: ISO C forbids an empty translation unit [-pedantic]
- 手机换IP的方法--手机PPTP
- jQuery入门(一)--jQuery中的选择器
- 静态创意和动态创意_8种独特且价格合理的名片的创意
- php网页制作代码_如何制作一个简单的HTML登录页面(附代码)
- 为什么你在公司说话没分量,得不到别人的重视?
- k8s控制器——Replicaset和Deployment
- 初识Excel的IF, IFERROR, MATCH, COUNTA公式
- 西安临潼秦始皇陵、地宫、八大奇迹馆、骊山一日游