搜索
查看: 827|回复: 0

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

[复制链接]

1839

主题

2255

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11913
发表于 2017-5-7 23:30:18 | 显示全部楼层 |阅读模式
项目名称:HtmlSanitizer
NuGet安装指令:Install-Package HtmlSanitizer
官方网站:[url=]https://github.com/mganss/HtmlSanitizer[/url]
开源协议: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><divalert('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库;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?Join BUC

x
过段时间可能会取消签到功能了
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表