项目名称:HtmlSanitizer NuGet安装指令:Install-Package HtmlSanitizer 官方网站:[url=]https://github.com/mganss/HtmlSanitizer[/url] 开源协议:MIT 可靠程度:更新活跃,目前已经是3.x版,成熟靠谱。
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 < 5,<SPAN>test</p>这种不规范的写法会被处理成<span>test<p></p></span> 3) HtmlSanitizer依赖于AngleSharp这个开源库做html的解析,因此如果用的时候存在一些bug,可以尝试升级一下AngleSharp库;
|