source

HttpRequestValidation을 피하는 방법예외를 발생시킨 동일한 뷰를 렌더링하는 ASP.NET MVC에서 예외 발생

manysource 2023. 5. 20. 10:56

HttpRequestValidation을 피하는 방법예외를 발생시킨 동일한 뷰를 렌더링하는 ASP.NET MVC에서 예외 발생

HttpRequestValidationHttpRequestValidation이의 유효성을 검사 치료.예외는 제출된 값에 관계없이 느려지지 않습니다.예를 들어, 텍스트 입력을 사용하여 사용자가 입력하는 경우<BR/>예외가 발생하고 노란색 죽음의 화면이 표시됩니다.나는 그것을 원하지 않는다.예외를 포착하고 가능하면 동일한 값으로 로드된 컨트롤을 제출한 상태에서 현재 보기에서 사용자에게 친숙한 오류를 표시합니다.

저는 http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html, 을 찾았지만 제 목적에는 쓸모가 없습니다.또한, 저는 http://msdn.microsoft.com/en-us/library/aa973813.aspx 을 찾아서 모델 바인더를 넣으려고 했지만 작업을 할 수 없었습니다.

최신 버전의 ASP.NET MVC(이 문서를 작성할 당시 RC)를 사용하면 컨트롤러 클래스나 작업 방법에 속성을 넣을 수 있습니다. 예를 들어 다음과 같습니다.

[ValidateInput(false)]
public ActionResult create()
{
    // ...method body
}

검증입력 특성이 시스템에 있습니다.웹.MVC.

그러나 다른 사용자가 말했듯이 수동 입력 유효성 검사나 클리닝을 직접 수행해야 합니다.

"MVC 3"에 포함되어 .<system.web><httpRuntime requestValidationMode="2.0" /></system.web>

ASP 에서는 ASP MVC 3을 할 수 .[AllowHtml]모델/보기 모델의 개별 필드/속성에 대한 속성을 입력하여 해당 필드에 대한 유효성 검사를 해제할 수 있습니다.모델의 특정 필드에 이 속성을 추가한 다음 우수한 AntiXSS 라이브러리(NuGet을 통해서도 사용 가능)를 사용하여 다음을 호출하여 사용자 입력을 검사합니다.Sanitizer.GetSafeHtmlFragment(mymodel.Description)서 "내 뷰에서 ("Description" 속성뷰속로문으성모자다열포의니델, 다을합함음여서기내은▁on다▁(▁is▁property▁the▁string▁property,니)를 갖는 속성입니다.[AllowHtml]적용된 특성)

필터를 사용하여 이(및 기타) 예외를 탐지하는 방법에 대한 매우 자세한 예는 http://code.google.com/p/geochat/source/browse/Source/Web/GeoChat.MvcExtensions/ExceptionHandlerAttribute.cs 를 참조하십시오.

이렇게 하면 유효성 검사를 계속 사용할 수 있지만 사용자가 "죽음의 노란색 화면"을 볼 수 없게 됩니다.

이 버전은 단순화된(너무 단순화된) 버전입니다.

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true), AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public class ExceptionHandlerAttribute : FilterAttribute, IExceptionFilter {

private HandleErrorAttribute attribute = new HandleErrorAttribute();

public ExceptionHandlerAttribute() {
  this.ExceptionType = typeof(Exception);
  this.Order = 1;
}

public string View {
  get {
    return attribute.View;
  }
  set {
    attribute.View = value;
  }
}

public Type ExceptionType {
  get {
    return attribute.ExceptionType;
  }
  set {
    attribute.ExceptionType = value;
  }
}

public void OnException(ExceptionContext filterContext) {
  if (this.ExceptionType.IsInstanceOfType(filterContext.Exception)) {
    string controller = (string)filterContext.RouteData.Values["controller"];
    string action = (string)filterContext.RouteData.Values["action"];
    if (controller == null)
      controller = String.Empty;

    if (action == null)
      action = String.Empty;

    HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controller, action);
    ViewResult result = new ViewResult();
    result.ViewName = this.View;
    result.MasterName = String.Empty;
    result.ViewData = new ViewDataDictionary<HandleErrorInfo>(model);

    result.TempData = filterContext.Controller.TempData;
    filterContext.Result = result;

    filterContext.ExceptionHandled = true;
    filterContext.HttpContext.Response.Clear();
    filterContext.HttpContext.Response.StatusCode = 500;
  }
}

}

global.asax Application_Error에서 오류를 발견하는 대신 이 오류를 명시적으로 포착하고 오류 메시지와 적절한 보기 데이터가 있는 보기로 리디렉션하는 컨트롤러에 대한 오류 처리기를 추가하여 오류를 발견할 수 있습니다.

저는 이것을 속성으로 어떻게 하는지에 대한 다소 오래된 게시물을 발견했습니다.

입증하다요청 유효성 검사를 비활성화하려면 InputAttribute가 적합합니다.컨트롤러가 요청 수신(view/aspx가 아님)을 담당하기 때문에 뷰 내 선언적 메서드(aspx)가 작동하지 않습니다.

ValidateRequest="false"를 aspx 보기 선언에 넣되, 일부 xss 공격을 방지하기 위해 사용자가 코드 내에서 입력한 텍스트를 검사합니다.

언급URL : https://stackoverflow.com/questions/249066/how-to-avoid-httprequestvalidationexception-in-asp-net-mvc-rendering-the-same-vi