安全漏洞系列(一)---XSS漏洞解决方案(C# MVC)
标签:href NPU encode ret font pre inf 输入 html
参考地址:https://www.cnblogs.com/sagecheng/p/9462239.html
测试项目:MVCDemo
一、XSS漏洞定义
XSS攻击全称跨站脚本攻击,它允许恶意web用户将代码(如:html代码)植入到页面上,当访问到该页面时,嵌入到页面的html代码会自动执行,从而达到恶意攻击的目的。
二、解决方案
1.新建立一个XSSHelper帮助类
1 public static class XSSHelper
2 {
3 ///
4 /// XSS过滤
5 ///
6 /// html代码
7 /// 过滤结果
8 public static string XssFilter(string html)
9 {
10 string str = HtmlFilter(html);
11 return str;
12 }
13
14 ///
15 /// 过滤HTML标记
16 ///
17 ///
18 ///
19 public static string HtmlFilter(string Htmlstring)
20 {
21 string result = System.Web.HttpUtility.HtmlEncode(Htmlstring);
22 return result;
23 }
24 }
2.再建立一个XSSFilterAttribute过滤类
1 ///
2 /// XSS 过滤器
3 ///
4 public class XSSFilterAttribute : ActionFilterAttribute
5 {
6 ///
7 /// OnActionExecuting
8 ///
9 ///
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 ///
46 /// 遍历实体的字符串属性
47 ///
48 /// 数据类型
49 /// 对象
50 ///
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)],因为用户如果加入类似
安全漏洞系列(一)---XSS漏洞解决方案(C# MVC)
标签:href NPU encode ret font pre inf 输入 html
原文地址:https://www.cnblogs.com/jas0203/p/11044629.html
评论