.NET MVC 安全漏洞系列
一、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了