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嵌套)。