参考地址: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>的话,直接就报错了,界面不友好,所以就修改为后台对输入的内容进行过滤处理。如果压根不希望用户输入类似的字符,需要也在前端进行一下验证就可以了。 |