ASP.NET网站自定义错误处理及其它安全相关

竹林之风7个月前 (05-01)技术积累587

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

相关文章

在线支付子模块的设计与实现

        一个在线交易系统需要各种支付方式方便客户付款,这些支付方式按场景可分为在线支付和线下现付。线下现付常见的...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法和观点。