项目名称: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 &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跨平台或扫描二维码关注

ASP.Net防范XSS漏洞攻击的利器HtmlSanitizer相关推荐

  1. 网站安全之XSS漏洞攻击以及防范措施

    在网站开发中,安全问题是重中之重的问题,特别像一个sql注入,XSS漏洞攻击,等的防范,如果不做好,网站将存在很大的隐患 XSS漏洞是网站漏洞中最容易出现的一种,至少现在的各大网站中基本都存在,传闻只 ...

  2. php的服务器变量$SERVER以及防止$_SERVER['PHP_SELF']造成的XSS漏洞攻击及其解决方案

    一.背景 突然想起来之前面试的一些面试题,让我写出几个服务器变量$SERVER代表的意思..实话实说,这些东西已经忘记很久了,都是用的时候直接上网查,今天再复习复习吧. 二.$SERVER $_SER ...

  3. java前端提示反射型xss_解决反射型XSS漏洞攻击

    1 /* 2 * Copyright (C), 2001-2019, xiaoi机器人3 * Author: han.sun4 * Date: 2019/2/28 11:395 * History:6 ...

  4. 防止XSS漏洞攻击常用解决方案

    漏洞通用描述 跨站脚本攻击(Cross Site Scripting),简称XSS漏洞. 该页面直接将用户在 HTML 页面中的输入(通常是参数值)加载到前端页面,没有预先加以清理. 如果脚本在响应页 ...

  5. 新浪微博的XSS漏洞攻击过程详解

    今天晚上(2011年6月28日),新浪微博出现了一次比较大的XSS攻击事件.大量用户自动发送诸如:"郭美美事件的一些未注意到的细节","建 党大业中穿帮的地方" ...

  6. 使用AntiSamy防范XSS跨站脚本攻击

    0x00 什么是XSS? XSS(Cross Site Scripting),即跨站脚本攻击,是一种常见于web application中的计算机安全漏洞.XSS通过在用户端注入恶意的可运行脚本,若服 ...

  7. 跨站脚本攻击之反射型XSS漏洞【转载】

    转载自FovWeb.com 如果一个WEB应用程序使用动态页面传递参数向用户显示错误信息,就有可能会造成一种常见的XSS漏洞.一般情况下,这种页面使用一个包含消息文本的参数,并在页面加载时将文本返回给 ...

  8. XSS跨站脚本攻击实例讲解,新浪微博XSS漏洞过程分析

    2011年6月28日晚,新浪微博遭遇到XSS蠕虫攻击侵袭,在不到一个小时的时间,超过3万微博用户受到该XSS蠕虫的攻击.此事件给严重依赖社交网络的网友们敲响了警钟.在此之前,国内多家著名的SNS网站和 ...

  9. java反射行跨站脚本攻击_跨站脚本攻击之反射型XSS漏洞【转载】

    如果一个WEB应用程序使用动态页面传递参数向用户显示错误信息,就有可能会造成一种常见的XSS漏洞.一般情况下,这种页面使用一个包含消息文本的参数,并在页面加载时将文本返回给用户.对于开发者来说,使用这 ...

最新文章

  1. 功率半导体碳化硅(SiC)技术
  2. java每日小算法(22)
  3. oracle locked timed,Oracle里面的用户smsdb无法登录 LOCKED(TIMED)
  4. 智能家居中语音识别算法研究_语音识别研究获进展
  5. 微波网络归一化转移矩阵[a]导出散射矩阵[S]
  6. 单链表java实现及相关操作(版本1)
  7. Luogu4074[WC2013] 糖果公园
  8. java的mergesort函数_MergeSort -- 归并排序
  9. Echarts 三维地图
  10. mysql 免安装版安装
  11. 2008年高考数学江西卷压轴题
  12. warning: ISO C forbids an empty translation unit [-pedantic]
  13. 手机换IP的方法--手机PPTP
  14. jQuery入门(一)--jQuery中的选择器
  15. 静态创意和动态创意_8种独特且价格合理的名片的创意
  16. php网页制作代码_如何制作一个简单的HTML登录页面(附代码)
  17. 为什么你在公司说话没分量,得不到别人的重视?
  18. k8s控制器——Replicaset和Deployment
  19. 初识Excel的IF, IFERROR, MATCH, COUNTA公式
  20. 西安临潼秦始皇陵、地宫、八大奇迹馆、骊山一日游

热门文章

  1. js温故而知新11(AJAX)——学习廖雪峰的js教程
  2. Hadoop 2.0.0-alpha尝鲜安装和hello world
  3. bigpipe merge对F5做批量配置
  4. Lucifer的一场暴强围英雄表演
  5. JS实现上下左右四方向无间隙滚动
  6. 特斯拉为何使用.NET 技术栈?
  7. .NET 云原生架构师训练营(设计原则设计模式)--学习笔记
  8. .Net之代码优先gRPC服务
  9. 同学,解决下这个 Bug!
  10. 使用表达式自定义Serilog输出格式