我已经建立了一个不错的MVC4应用程序,决定保护它,一切都很好。以下是我用来帮助防止XSS攻击的过滤器。
public class IsPostedFromThisSiteAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//TODO: - Possible problems in future:
//1. Is there a way to handle the execptions and just display a friendly error page / message.
if (filterContext.HttpContext != null)
{
if (filterContext.HttpContext.Request.UrlReferrer == null)
throw new System.Web.HttpException("Invalid Submission");
//if (filterContext.HttpContext.Request.UrlReferrer.Host != "localhost/YeatsClinical.PatientPortal.Web")
if (filterContext.HttpContext.Request.UrlReferrer.AbsolutePath != ConfigurationManager.AppSettings["SiteURL"])
throw new System.Web.HttpException("This form was not submitted from this site!");
}
}
}
我的MVC应用程序安装了Elmah,它也很有效。
问题是,我知道上面的错误,我不想显示异常消息,或者记录它或类似的东西(所有这些我都可以轻松完成)。相反,我想通过向用户显示一条漂亮的小消息来正确处理它。我如何更改上面的代码,以允许它显示带有一个漂亮的小消息的视图或部分视图,或者只是在某处输出一些文本,让用户以一种不会导致应用程序崩溃的好方式知道出了什么问题,也许在这种特殊情况下,将他送回正确的登录界面。
答案 0 :(得分:2)
只需在Result
上分配filterContext
属性:
public class IsPostedFromThisSiteAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//TODO: - Possible problems in future:
//1. Is there a way to handle the execptions and just display a friendly error page / message.
if (filterContext.HttpContext != null)
{
if (filterContext.HttpContext.Request.UrlReferrer == null)
{
var viewResult = new ViewResult
{
ViewName = "~/Views/Shared/Invalid.cshtml"
};
filterContext.Result = viewResult;
return;
}
if (filterContext.HttpContext.Request.UrlReferrer.AbsolutePath != ConfigurationManager.AppSettings["SiteURL"])
{
var viewResult = new ViewResult
{
ViewName = "~/Views/Shared/InvalidSite.cshtml"
};
filterContext.Result = viewResult;
return;
}
}
}
}
这将阻止执行控制器操作,并立即执行您已分配给ActionResult
Result
属性的filterContext
。基本上你是在短暂执行动作。你可以返回你想要的任何ActionResult:ViewResult,PartialViewResult,JsonResult,RedirectToRouteResult,......