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 onload=""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库;

猜你喜欢

转载自blog.csdn.net/qq_18145031/article/details/80591787