安全漏洞系列---XSS漏洞解决方案(C# MVC)
Posted jas0203
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安全漏洞系列---XSS漏洞解决方案(C# MVC)相关的知识,希望对你有一定的参考价值。
参考地址:https://www.cnblogs.com/sagecheng/p/9462239.html
测试项目:MVCDemo
一、XSS漏洞定义
XSS攻击全称跨站脚本攻击,它允许恶意web用户将代码(如:html代码)植入到页面上,当访问到该页面时,嵌入到页面的html代码会自动执行,从而达到恶意攻击的目的。
二、解决方案
1.新建立一个XSSHelper帮助类
1 public static class XSSHelper 2 3 /// <summary> 4 /// XSS过滤 5 /// </summary> 6 /// <param name="html">html代码</param> 7 /// <returns>过滤结果</returns> 8 public static string XssFilter(string html) 9 10 string str = HtmlFilter(html); 11 return str; 12 13 14 /// <summary> 15 /// 过滤HTML标记 16 /// </summary> 17 /// <param name="Htmlstring"></param> 18 /// <returns></returns> 19 public static string HtmlFilter(string Htmlstring) 20 21 string result = System.Web.HttpUtility.HtmlEncode(Htmlstring); 22 return result; 23 24
2.再建立一个XSSFilterAttribute过滤类
1 /// <summary> 2 /// XSS 过滤器 3 /// </summary> 4 public class XSSFilterAttribute : ActionFilterAttribute 5 6 /// <summary> 7 /// OnActionExecuting 8 /// </summary> 9 /// <param name="context"></param> 10 public override void OnActionExecuting(ActionExecutingContext context) 11 12 //获取参数集合 13 var ps = context.ActionDescriptor.GetParameters(); 14 if (ps.Count() == 0) 15 16 return; 17 18 //遍历参数集合 19 foreach (var p in ps) 20 21 if (context.ActionParameters[p.ParameterName] != null) 22 23 //当参数是str 24 if (p.ParameterType.Equals(typeof(string))) 25 26 context.ActionParameters[p.ParameterName] = XSSHelper.XssFilter(context.ActionParameters[p.ParameterName].ToString()); 27 28 else if (p.ParameterType.Equals(typeof(Int64))) 29 30 31 32 else if (p.ParameterType.Equals(typeof(Int32))) 33 34 35 36 37 else if (p.ParameterType.IsClass)//当参数是一个实体 38 39 PostModelFieldFilter(p.ParameterType, context.ActionParameters[p.ParameterName]); 40 41 42 43 44 45 /// <summary> 46 /// 遍历实体的字符串属性 47 /// </summary> 48 /// <param name="type">数据类型</param> 49 /// <param name="obj">对象</param> 50 /// <returns></returns> 51 private object PostModelFieldFilter(Type type, object obj) 52 53 if (obj != null) 54 55 foreach (var item in type.GetProperties()) 56 57 if (item.GetValue(obj) != null) 58 59 //当参数是str 60 if (item.PropertyType.Equals(typeof(string))) 61 62 string value = item.GetValue(obj).ToString(); 63 item.SetValue(obj, XSSHelper.XssFilter(value)); 64 65 else if (item.PropertyType.Equals(typeof(Int64))) 66 67 68 69 else if (item.PropertyType.Equals(typeof(Int32))) 70 71 72 73 else if (item.PropertyType.Equals(typeof(Int16))) 74 75 76 77 else if (item.PropertyType.IsClass)//当参数是一个实体 78 79 // item.SetValue(obj, PostModelFieldFilter(item.PropertyType, item.GetValue(obj))); 80 81 82 83 84 85 return obj; 86 87
3.在控制器上加上该属性,就可对传递过来的参数数值进行过滤(记得要引入对应的命名空间)
说明:为什么要加入[ValidateInput(false)],因为用户如果加入类似<script>的话,直接就报错了,界面不友好,所以就修改为后台对输入的内容进行过滤处理。如果压根不希望用户输入类似的字符,需要也在前端进行一下验证就可以了。
以上是关于安全漏洞系列---XSS漏洞解决方案(C# MVC)的主要内容,如果未能解决你的问题,请参考以下文章