ASP.NET网站自定义错误处理及其它安全相关
ASP.NET网站在运行过程中总是有可能报错,例如404等HTTP错误、500等程序异常。在IIS托管并报错的情况下,网站的默认行为依次是:
(1).NET运行时接收并处理的部分显示.NET报错页;
(2)Global.asax、Filter、DelegatingHandler等自定义处理;
(3)未转发到.NET运行时的部分根据web.config中的CustomErrors设置跳转到相应页面;
(4)以上都未接收并处理的部分跳转至IIS的默认报错页。
采用默认错误信息展示的方式,会在标头或页面中暴露.NET版本号、ASP.NET版本号、MVC版本号、IIS版本号等相关服务器信息,为扫描和攻击提供了参考信息;另一方面系统默认错误信息对用户也不友好。基于这些原因,我们对ASP.NET网站的错误信息进行自定义,对用户友好,也能降低漏洞被发现或系统被攻破的几率。
(1)程序异常时返回信息处理:
①不返回具体异常信息,统一显示如“系统发生异常并已记录,请稍候再试!”,避免提供攻击依据;
②登录错误时不返回“账号不正确”、“密码不正确”等具体提示,统一返回模糊提示如“账号或密码错误”;
③禁止SQL拼接;
④其它。
(2)在MVC中隐藏MVC版本号标头:
using System;
using System.Web;
using System.Web.Mvc;
namespace ***
{
public class WebApiApplication : HttpApplication
{
//……
protected void Application_Start()
{
//……
MvcHandler.DisableMvcResponseHeader = true;//禁止MVC响应标头
//……
}
//……
}
}(3)在MVC中的ExceptionFilterAttribute中自定义处理错误信息:
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Web;
using System.Web.Http.Filters;
namespace ***.Filters
{
public class LogExAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
base.OnException(actionExecutedContext);
//自定义处理错误信息
}
}
}(4)在MVC中的DelegatingHandler中自定义处理错误信息:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net.Http;
using System.Threading.Tasks;
using System.Threading;
using System.Net;
using System.Net.Http.Formatting;
using System.Diagnostics;
using System.Text;
namespace ***.Filters
{
public class CommonDelegatingHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//……
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
//自定义处理错误信息
//……
return response;
}
}
}(5)在MVC的Global.asax.cs中自定义处理错误信息(ASP.NET WebForm同理):
namespace ***
{
public class WebApiApplication : HttpApplication
{
//……
protected void Application_Error()
{
//……
//自定义处理错误信息
//……
}
//……
}
}(6)在web.config设置自定义错误页面,并禁用.NET/ASP.NET版本号标头:
<customErrors mode="RemoteOnly" defaultRedirect="~/ServerError.html"> </customErrors> <httpRuntime enableVersionHeader="false" />
(7)设置IIS禁用除GET、POST等以外的非常用谓词、去掉服务器参数相关响应标头、增加X-Frame-Options:SAMEORIGIN标头(防止被异源iframe嵌套)。

