视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
.net core xss攻击防御的方法
2020-11-27 22:34:56 责编:小采
文档

XSS攻击全称跨站脚本攻击 ,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。

比如我们在表单提交的时候插入脚本代码

如果不进行处理,那么就是这种效果,我这里只是演示一个简单的弹窗

下面给大家分享一下我的解决方案。

需要用到这个库:HtmlSanitizer

https://github.com/mganss/HtmlSanitizer

新建一个过滤类。

 public class XSS
 {
 private HtmlSanitizer sanitizer;
 public XSS()
 {
 sanitizer = new HtmlSanitizer();
 //sanitizer.AllowedTags.Add("div");//标签白名单
 sanitizer.AllowedAttributes.Add("class");//标签属性白名单,默认没有class标签属性 
 //sanitizer.AllowedCssProperties.Add("font-family");//CSS属性白名单
 }

 /// <summary>
 /// XSS过滤
 /// </summary>
 /// <param name="html">html代码</param>
 /// <returns>过滤结果</returns>
 public string Filter(string html)
 {
 string str = sanitizer.Sanitize(html);
 return str;
 }
 }

新建一个过滤器

 public class FieldFilterAttribute : Attribute,IActionFilter
 {
 private XSS xss;
 public FieldFilterAttribute()
 {
 xss = new XSS();
 }

 //在Action方法之回之后调用
 public void OnActionExecuted(ActionExecutedContext context)
 {

 }

 //在调用Action方法之前调用
 public void OnActionExecuting(ActionExecutingContext context)
 {
 //获取Action参数集合
 var ps = context.ActionDescriptor.Parameters;
 //遍历参数集合
 foreach (var p in ps)
 {
 if (context.ActionArguments[p.Name] != null)
 {
 //当参数等于字符串
 if (p.ParameterType.Equals(typeof(string)))
 {
 context.ActionArguments[p.Name] = xss.Filter(context.ActionArguments[p.Name].ToString());
 }
 else if (p.ParameterType.IsClass)//当参数等于类
 {
 ModelFieldFilter(p.Name, p.ParameterType, context.ActionArguments[p.Name]);
 }
 } 

 }
 }

 /// <summary>
 /// 遍历修改类的字符串属性
 /// </summary>
 /// <param name="key">类名</param>
 /// <param name="t">数据类型</param>
 /// <param name="obj">对象</param>
 /// <returns></returns>
 private object ModelFieldFilter(string key, Type t, object obj)
 {
 //获取类的属性集合
 var ats = t.GetCustomAttributes(typeof(FieldFilterAttribute), false);


 if (obj != null)
 {
 //获取类的属性集合
 var pps = t.GetProperties();

 foreach (var pp in pps)
 {
 if(pp.GetValue(obj) != null)
 {
 //当属性等于字符串
 if (pp.PropertyType.Equals(typeof(string)))
 {
 string value = pp.GetValue(obj).ToString();
 pp.SetValue(obj, xss.Filter(value));
 }
 else if (pp.PropertyType.IsClass)//当属性等于类进行递归
 {
 pp.SetValue(obj, ModelFieldFilter(pp.Name, pp.PropertyType, pp.GetValue(obj)));
 }
 }
 
 }
 }

 return obj;
 }
 }
 //属性过滤器
 [FieldFilter]
 public class NoteBookController : ManageController
 {
 //笔记操作接口
 private INoteBookAppService _noteBookApp;
 public NoteBookController(INoteBookAppService noteBookApp)
 {
 this._noteBookApp = noteBookApp;
 }
 public IActionResult Tab()
 {
 return View();
 }

 }

然后在需要过滤的控制器加上过滤控制器特性就可以了。这样所有string类型的参数就都会进行过滤了。如果不需要对整个控制器进行过滤,只需要在相应的Action加上特性。

下载本文
显示全文
专题