2015-01-10 3 views
1

양식 값에 HTML이 포함되어있을 때 감사 시스템이 작동하지 않습니다.ActionFilterAttribute - 잠재적으로 위험한 Request.Form 값

난 당해 모델 속성에 [AllowHtml] 속성을 추가하고, 컨트롤러 액션 [ValidateInput(false)] 추가뿐만 아니라 HttpRequestBaseUnvalidated() 확장 방법을 사용하여 시도 하였다.

아무 것도 오류를 예방하고 있지 않습니다. 이 실패 코드의 라인 (감사 코드에서 유래 ActionFilterAttributeOnActionExecuting())입니다 :

return Json.Encode(new { request.Cookies, request.Headers, request.Files, request.Form, request.QueryString, request.Params }); 

오류 : 타입 'System.Web.HttpRequestValidationException의

첫째 예외 'System.Web.dll에서 발생했습니다

추가 정보 잠재적으로 위험한 Request.Form 값은 클라이언트에서 발견되었습니다 (참고 = "<p>test</p>") 입니다.

"참고"는 [AllowHtml] 인 모델 속성입니다.

내가 이것을 막을 수있는 아이디어가 있습니까?

답변

2

ASP.NET MVC 파이프 라인에서 작업 순서를 이해하는 것이 중요합니다. OnActionExecuting 메서드는 컨트롤러의 작업이 시작되기 전에 호출됩니다. 귀하의 컨트롤러 동작이 실행되지 않았다면 귀하의 ValidateInput 주석이 고려되고 있지 않음을 의미합니다. 또한 모델 바인딩이 수행되지 않았으므로 AllowHtml 주석이 고려되지 않습니다. 이 시점에서 기본 Form 컬렉션에 액세스 할 수 있으며 Json.Encode()을 통해 일련 번호를 지정하여 데이터에 액세스하려고하면 ASP.NET의 보안 보호가 여전히 시작됩니다.

문제를 해결하려면 Web.config에서 요청 유효성 검사를 완전히 비활성화하거나 (권장하지 않음) JSON 직렬화에 좀 더주의를 기울이십시오. 이렇게하려면, 당신은 속성 값을 풀기 때 Unvalidated()를 호출해야합니다 :

return Json.Encode(new { 
    request.Cookies, 
    request.Headers, 
    request.Files, 
    new { 
     Note = Request.Unvalidated().Form["Note"] 
     //Add any other properties you care about here 
    }, 
    request.Form, 
    request.QueryString, 
    request.Params 
}); 
+0

작업의 파이프 라인 순서는 총 의미가, 감사합니다. 내 이슈는이 속성이 컨트롤러에서 다양한 액션 메소드에 적용되므로 특정 속성을 참조 할 수 없다는 것입니다. 나는 request.Form을 request.Unvalidated.Form로 대체하려고 시도했지만 이것은 문제를 해결하지 못하고있다. – Patrick

+1

그런 경우에는 액션 필터 속성에 유효성을 검사하지 않으려는 속성 이름을 지정하는 매개 변수 (아마도'string []')를 가져야합니다. 이 경우, 문자열 배열을 반복하고 'Request.Unvalidated(). Form [propertyName]'과 같은 것을 사용하여 속성을 찾을 수 있습니다. –

관련 문제