Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 941|回复: 0

安全漏洞系列(一)---XSS漏洞解决方案(C# MVC)

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-5 23:05:25 | 显示全部楼层 |阅读模式

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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 02:19 , Processed in 0.059286 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表