安全漏洞系列---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)的主要内容,如果未能解决你的问题,请参考以下文章

如何避免Winforms c#中的Reflected_xss_all_clients漏洞

网络安全漏洞系列-CSRF漏洞攻防

动手实验Django debug page XSS漏洞复现

搜索框存在xss漏洞,怎样修复

漏洞扫描系列总结

信安小白,一篇博文讲明白存储型反射型XSS漏洞