什么是XSS
通过“HTML注入”篡改了网页,插入了恶意脚本,从而在用户在浏览网页时,实现控制用户浏览器行为的一种攻击方式。XSS属于客户端代码注入,通常注入代码是JavaScript。区别于命令注入,SQL注入属于服务端代码注入。
为什么要过滤XSS
最近接到维护性项目,客户反馈网站的富文本编辑器中图片无法保存,通过排除发现是客户的服务器最近设置了XSS拦截,导致带有标签<img src/>的标签的富文本请求被拦截了,导致图片保存失败。由于客户不是太清楚服务器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);
}
});
});
});
}
/// <summary>
/// 过滤HTML标记,XSS过滤
/// </summary>
/// <param name="html">html代码</param>
/// <returns>过滤后的代码</returns>
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漏洞。希望本文可以给网友一些参考和帮助,如果有描述不准确的地方欢迎反馈和指正。