首页 > 其他分享 >.NET MVC 安全漏洞系列

.NET MVC 安全漏洞系列

时间:2023-09-17 20:33:57浏览次数:35  
标签:Version string Server item MVC 安全漏洞 obj NET 节点

一、XSS漏洞定义

  XSS攻击全称跨站脚本攻击,它允许恶意web用户将代码(如:html代码)植入到页面上,当访问到该页面时,嵌入到页面的html代码会自动执行,从而达到恶意攻击的目的。

二、解决方案

  1.新建立一个XSSHelper帮助类

public static class XSSHelper
    {
        /// <summary>
        /// XSS过滤
        /// </summary>
        /// <param name="html">html代码</param>
        /// <returns>过滤结果</returns>
        public static string XssFilter(string html)
        {
            string str = HtmlFilter(html);
            return str;
        }

        /// <summary>
        /// 过滤HTML标记
        /// </summary>
        /// <param name="Htmlstring"></param>
        /// <returns></returns>
        public static string HtmlFilter(string Htmlstring)
        {
            string result = System.Web.HttpUtility.HtmlEncode(Htmlstring);
            return result;
        }
    }

2.再建立一个XSSFilterAttribute过滤类

/// <summary>
    /// XSS 过滤器
    /// </summary>
    public class XSSFilterAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// OnActionExecuting
        /// </summary>
        /// <param name="context"></param>
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            //获取参数集合
            var ps = context.ActionDescriptor.GetParameters();
            if (ps.Count() == 0)
            {
                return;
            }
            //遍历参数集合
            foreach (var p in ps)
            {
                if (context.ActionParameters[p.ParameterName] != null)
                {
                    //当参数是str
                    if (p.ParameterType.Equals(typeof(string)))
                    {
                        context.ActionParameters[p.ParameterName] = XSSHelper.XssFilter(context.ActionParameters[p.ParameterName].ToString());
                    }
                    else if (p.ParameterType.Equals(typeof(Int64)))
                    {

                    }
                    else if (p.ParameterType.Equals(typeof(Int32)))
                    {

                    }

                    else if (p.ParameterType.IsClass)//当参数是一个实体
                    {
                        PostModelFieldFilter(p.ParameterType, context.ActionParameters[p.ParameterName]);
                    }
                }

            }
        }
        /// <summary>
        /// 遍历实体的字符串属性
        /// </summary>
        /// <param name="type">数据类型</param>
        /// <param name="obj">对象</param>
        /// <returns></returns>
        private object PostModelFieldFilter(Type type, object obj)
        {
            if (obj != null)
            {
                foreach (var item in type.GetProperties())
                {
                    if (item.GetValue(obj) != null)
                    {
                        //当参数是str
                        if (item.PropertyType.Equals(typeof(string)))
                        {
                            string value = item.GetValue(obj).ToString();
                            item.SetValue(obj, XSSHelper.XssFilter(value));
                        }
                        else if (item.PropertyType.Equals(typeof(Int64)))
                        {

                        }
                        else if (item.PropertyType.Equals(typeof(Int32)))
                        {

                        }
                        else if (item.PropertyType.Equals(typeof(Int16)))
                        {

                        }
                        else if (item.PropertyType.IsClass)//当参数是一个实体
                        {
                            //   item.SetValue(obj, PostModelFieldFilter(item.PropertyType, item.GetValue(obj)));
                        }
                    }

                }
            }
            return obj;
        }
    }

3.在控制器上加上该属性,就可对传递过来的参数数值进行过滤(记得要引入对应的命名空间)

 

说明:为什么要加入[ValidateInput(false)],因为用户如果加入类似<script>的话,直接就报错了,界面不友好,所以就修改为后台对输入的内容进行过滤处理。如果压根不希望用户输入类似的字符,需要也在前端进行一下验证就可以了。

 

站点信息侦测(C# MVC)

概述:站点信息侦测漏洞会检测到用的版本信息等,然后借此进行一些攻击。

 

解决方案

一、隐藏MVC版本信息(节点:X-AspNetMvc-Version:)

  1.在Global.asax.cs文件中添加如下代码:

//隐藏MVC版本信息(节点:X-AspNetMvc-Version:)
 MvcHandler.DisableMvcResponseHeader = true;

 再次运行,就不显示节点:X-AspNetMvc-Version了

 

 

二、隐藏asp.net 版本信息(节点:X-AspNet-Version)

  1.在配置文件中找到节点httpRuntime,添加属性enableVersionHeader="false"

<httpRuntime targetFramework="4.5.2" enableVersionHeader="false"  />

再次运行,就不显示节点X-AspNet-Version了

 

三、隐藏X-Powered-By节点

  1.配置文件中找到节点httpRuntime,添加如下代码:(如有就修改,没有就新增)

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

 再次运行,就不显示节点X-AspNet-Version了

 

四、隐藏Server信息

  在在Global.asax.cs文件中添加如下代码:

/// <summary>
        /// 隐藏/修改 Response Header 中的Server节点(IIS版本信息)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
        {
            HttpApplication application = sender as HttpApplication;
            if (application != null && application.Context != null)
            {
                //移除Server
                application.Context.Response.Headers.Remove("Server");
                //修改Server的显示信息
                //application.Context.Response.Headers.Set("Server", "MyServer");

                //移除X-AspNet-Version,和上面效果相同
                //application.Context.Response.Headers.Remove("X-AspNet-Version");
                //移除X-AspNetMvc-Version,和上面效果相同
                //application.Context.Response.Headers.Remove("X-AspNetMvc-Version");
            }

        }

再次运行,就不显示节点Server了

 

标签:Version,string,Server,item,MVC,安全漏洞,obj,NET,节点
From: https://www.cnblogs.com/daboluo/p/17709734.html

相关文章

  • 【C#】.NET6.0后支持的顶级语句使用命名空间(namespace)问题
    创建C#项目且使用.Net6.0以上的版本时,默认code会使用顶级语句形式:1、略去staticvoidMain(String[]args)主方法入口;2、隐式使用(即隐藏且根据代码所需要的类自动调用)其他命名空间(包括):usingSystem;usingSystem.IO;usingSystem.Collections.Generic;usingSystem.Linq;......
  • keepalived 报错/usr/sbin/keepalived: error while loading shared libraries: /lib6
    yuminstallkeepalived的时候提示需要一下包Installing: keepalived                                        x86_64                               1.3.5-19.el7               ......
  • BizTalk RosettaNet解决方案与项目调研
    BizTalk/AzureLogicAPP/EDIFACT/X12/RosettaNET/AS2培训或项目开发需求,欢迎随时联系:Email:[email protected] ,微信(WeChat)/Tel:18511575973RosettaNet组织(http://www.rosettanet.org)于1998年6月创建,是非盈利性的国际性组织,目前归属于GS1US。它在全球存在众多的分支机构,在国......
  • .NET中测量多线程基准性能
    .NET中测量多线程基准性能 多线程基准性能是用来衡量计算机系统或应用程序在多线程环境下的执行能力和性能的度量指标。它通常用来评估系统在并行处理任务时的效率和性能。测量中通常创建多个线程并在这些线程上执行并发任务,以模拟实际应用程序的并行处理需求。在此,我们用多......
  • Layered Network stack
    3.LayeredNetworkstackModularityDoesnotspecifyanimplementationInstead,tellsushowtoorganizefunctionalityEncapsulationInterfacesdefinecross-layerinteractionLayersonlyrelyonthosebelowthemFlexibilityReuseofcodeacrossth......
  • .NET Core 实现Excel的导入导出
    目录前言NPOI简介一、安装相对应的程序包1.1、在“管理NuGet程序包”中的浏览搜索:“NPOI”二、新建Excel帮助类三、调用3.1、增加一个“keywords”模型类,用作导出3.2、添加一个控制器3.3、编写导入导出的控制器代码3.3.1、重写“Close”函数3.3.2、添加控制器代码3.3.3、Excel......
  • 前端请求参数加密、.NET 后端解密
    本文详细介绍了前端请求参数加密、.NET后端解密,文章较长,请各位看官耐心看完。目录一、前端使用“CryptoJS”,前端AES加密,.NET后端AES解密1.1、加密解密效果图1.2、CryptoJS介绍1.3、准备工作:安装“CryptoJS”1.3.1、使用npm进行安装1.3.2、VisualStudio中安装1.3.2.1、选择“客......
  • 图解几种常见 Kubernetes Pod 驱逐场景
    图解几种常见KubernetesPod驱逐场景sysdig 奇妙的Linux世界 2023-09-1708:20 发表于重庆 1人听过收录于合集#云原生263个#Kubernetes280个#Docker203个#开源461个公众号关注 「奇妙的Linux世界」设为「星标」,每天带你玩转Linux! KubernetesPod被......
  • ASP.NET MVC5多语言切换快速实现方案
    实现动态切换语言,Demo做了三种语言库可以切换,包括资源文件的定义,实体对象属性设置,后台代码Controller,IAuthorizationFilter,HtmlHelper的实现,做法比较简单易学易用,配合我之前发布的# MVCScaffoldingSmartCode-Engine更新 模板中新增了多语言资源文件的生成功能,发现......
  • NetCore 国际化最佳实践
    NetCore国际化最佳实践ASP.NETCore中提供了一些本地化服务和中间件,可将网站本地化为不同的语言文化。ASP.NETCore中我们可以使用Microsoft.AspNetCore.Localization库来实现本地化。但是默认只支持使用资源文件方式做多语言存储,很难在实际场景中使用。有没有可能支持官方资源......