.NET MVC使用HtmlSanitizer过滤XSS攻击

什么是XSS

通过“HTML注入”篡改了网页,插入了恶意脚本,从而在用户在浏览网页时,实现控制用户浏览器行为的一种攻击方式。XSS属于客户端代码注入,通常注入代码是JavaScript。区别于命令注入,SQL注入属于服务端代码注入。

 

为什么要过滤XSS

最近接到维护性项目,客户反馈网站的富文本编辑器中图片无法保存,通过排除发现是客户的服务器最近设置了XSS拦截,导致带有标签的标签的富文本请求被拦截了,导致图片保存失败。由于客户不是太清楚服务器XSS拦截的具体设置,给出的方案是服务器取消XSS拦截设置,在程序中处理XSS请求。通过搜索发现HtmlSanitizer程序集已经处理了XSS漏洞,那么项目中我们就直接引入该程序集解决XSS漏洞问题。

 

安装HtmlSanitizer

由于项目是基于.NET Framework 4.5开发的,所以通过nuget确定支持该框架的最新版本为4.0.217,通过如下命令行直接在VS中安装:

Install-Package HtmlSanitizer -Version 4.0.217

官方Github地址:https://github.com/mganss/HtmlSanitizer

 

使用HtmlSanitizer过滤XSS

项目为MVC的项目,我们通过AOP的方式来全局过滤XSS达到代码侵入最小,实现ActionFilterAttribute(ActionFilterAttribute的开发可以参考 MVC过滤器开发)来过滤XSS:

public class ModelFillAttribute : ActionFilterAttribute
{
    //初始化HtmlSanitizer
    private readonly HtmlSanitizer htmlSanitizer = new HtmlSanitizer();

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        var parameters = filterContext.ActionParameters;
        if (parameters == null || parameters.Count == 0)
            return;

        parameters.ForEach(parameter =>
        {
            var model = parameter.Value;
            if (model == null) return;
            var list = new ArrayList();

            if (typeof(ICollection).IsAssignableFrom(model.GetType()))
            {
                list.AddRange(model as ICollection);
            }
            else
            {
                list.Add(model);
            }

            list.ToArray().ForEach(item =>
            {
                var propertys = item.GetType().GetProperties();
                propertys.ForEach(p =>
                {
                    if (p.PropertyType.Name.ToLower().Contains("string") && p.GetValue(item) != null && p.GetSetMethod() != null)
                    {
                        //XSS过滤
                        value = HtmlXSSFilter(value);
                        p.SetValue(item, value);
                    }
                });
            });
        });

    }

    /// 
    /// 过滤HTML标记,XSS过滤
    /// 
    /// html代码
    /// 过滤后的代码
    private string HtmlXSSFilter(string html)
    {
        if(!string.IsNullOrWhiteSpace(html) && htmlSanitizer != null)
            html = htmlSanitizer.Sanitize(html);

        return html;
    }
}

然后直接在需要验证的地方通过AOP调用ActionFilterAttribute过滤XSS,或者注册为全局的ActionFilterAttribute,过滤整个项目的所有请求。

HtmlSanitizer可以配置过滤的条件,比如标签,属性,样式等等,可以通过Github查看具体是使用,本项目使用默认的配置。

项目中通过使用HtmlSanitizer程序集,快速的过滤了XSS漏洞。希望本文可以给网友一些参考和帮助,如果有描述不准确的地方欢迎反馈和指正。

你可能感兴趣的:(.NET,开发笔记)