近期遇到客戶要求對網站進行弱點掃描,報告中其中一項是 Server Error Message,意思是當發生錯誤時,白底黃框的錯誤訊息會直接呈現給使用者,若是給一般使用者看到頂多得到觀感不佳的回饋,要是給 Hacker 看到,網站危險性一下就提升好幾個檔次,所以程式在運行過程發生錯誤時,應導向至錯誤畫面,而非暴露赤裸裸的錯誤資訊。
所以說,發生錯誤時要如何導向到錯誤頁面?自己寫 RedirectToAction?
其實 ASP.NET MVC 預設會在 FilterConfig.cs 中註冊 HandleErrorAttribute,也就是當發生 Http Status Code 500 時會交給 HandleErrorAttribute 去處理,它的功用是當程式部署後,倘若發生錯誤就會導向到 Error.cshtml,使用者就不會看到詳細錯誤資訊。不過在開發環境中還是可以看到詳細的錯誤資訊。
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// 預設註冊
filters.Add(new HandleErrorAttribute());
}
}
要讓頁面成功導向到錯誤頁面,try catch
基本功不可少,當 Exception 發生時會呼叫 HandleErrorAttribute 裡的 OnException,OnException 會將畫面導向到預設的錯誤頁面,也就是 Error。有興趣的朋友可以喵一眼 OnException 的 Source Code
//
// Summary:
// Called when an exception occurs.
//
// Parameters:
// filterContext:
// The action-filter context.
//
// Exceptions:
// T:System.ArgumentNullException:
// The filterContext parameter is null.
public virtual void OnException(ExceptionContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (!filterContext.IsChildAction && !filterContext.ExceptionHandled && filterContext.HttpContext.IsCustomErrorEnabled)
{
Exception exception = filterContext.Exception;
if (new HttpException(null, exception).GetHttpCode() == 500 && ExceptionType.IsInstanceOfType(exception))
{
string controllerName = (string)filterContext.RouteData.Values["controller"];
string actionName = (string)filterContext.RouteData.Values["action"];
HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
filterContext.Result = new ViewResult
{
ViewName = View,
MasterName = Master,
ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
TempData = filterContext.Controller.TempData
};
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
}
試著引發錯誤訊息讓畫面導向到 Error Page。
public ActionResult Index()
{
try
{
// 刻意引發錯誤訊息
throw new Exception();
return View();
}
catch (Exception ex)
{
throw;
}
}
打完,收工!
Thanks for reading the article 🌷 🌻 🌼
If you like it, please don't hesitate to click heart button ❤️
or follow my GitHub ⭐ I'd appreciate it.
Top comments (0)