[asp.net-mvc] 사용자가 ASP.NET MVC에서 HTML을 입력하도록 허용-ValidateInput 또는 AllowHtml

사용자가 ASP.net MVC를 사용하여 특정 필드에 HTML을 입력하도록 허용하려면 어떻게해야합니까?

컨트롤러에서이 복잡한 개체에 매핑되는 많은 필드가있는 긴 형식이 있습니다.

하나의 필드 (설명)가 HTML을 허용하도록 만들고 싶습니다. HTML은 나중에 나만의 위생을 수행 할 것입니다.



답변

HTML을 허용하려는 컨트롤러의 작업 (게시)에 다음 속성을 추가합니다.

[ValidateInput(false)] 

편집 : 당으로 Charlino의 의견 :

web.config에서 사용되는 유효성 검사 모드를 설정하십시오. MSDN 참조 :

<httpRuntime requestValidationMode="2.0" />

2014 년 9 월 편집 : 스프린터에 따라 252 개의 댓글 :

이제 [AllowHtml]속성을 사용해야 합니다. MSDN 에서 아래를 참조하십시오 .

ASP.NET MVC 3 응용 프로그램의 경우 모델에 HTML을 다시 게시해야 할 때 ValidateInput (false)을 사용하여 요청 유효성 검사를 끄지 마십시오. 다음과 같이 모델 속성에 [AllowHtml]을 추가하면됩니다.

public class BlogEntry {
    public int UserId {get;set;}
    [AllowHtml]
    public string BlogText {get;set;}
 }

답변

무엇에 대한 [AllowHtml]특성 위의 속성?


답변

모델에 추가 :

using System.Web.Mvc;

그리고 당신의 재산에

        [AllowHtml]
        [Display(Name = "Body")]
        public String Body { get; set; }

내 관점 에서이 코드는이 오류를 피하는 가장 좋은 방법입니다. HTML 편집기를 사용하는 경우 이미 제한되어 있으므로 보안 문제가 없습니다.


답변

[AllowHtml]보안 수준을 낮출 것을 제안하는 블로그와 댓글이 많이 있으므로 특정 속성을 추가 하는 것이 권장되는 솔루션입니다.

이를 추가하면 MVC 프레임 워크는 컨트롤러가 히트하고 해당 컨트롤러의 코드가 실행되도록합니다.

그러나 코드, 필터 등에 따라 응답이 생성되는 방식과 다른 유사한 오류를 트리거 할 수있는 추가 유효성 검사가 있는지 여부에 따라 다릅니다.

어쨌든 [AllowHtml]속성을 추가 하면 컨트롤러에서 html을 역 직렬화 할 수 있으므로 정답입니다. 뷰 모델의 예 :

[AllowHtml]
public string MessageWithHtml {get; set;}


답변

[System.Web.Mvc.AllowHtml]몇 가지 답변에서 설명한 것처럼 관련 속성에 추가했지만 동일한 문제에 직면했습니다 .

제 경우에는 MVC 유효성 검사가 발생 하기 전에UnhandledExceptionFilter Request 개체에 액세스 하는 클래스가 있으므로 AllowHtml이 효과가 없으며이 액세스는 .[HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client

즉, Request 객체의 특정 속성에 액세스하면 암시 적으로 유효성 검사가 시작됩니다 (내 경우에는 Params속성).

유효성 검사를 방지하는 솔루션은 MSDN에 문서화되어 있습니다.

요청의 특정 필드 (예 : 입력 요소 또는 쿼리 문자열 값)에 대한 요청 유효성 검사를 비활성화하려면 다음 예제와 같이 항목을 가져올 때 Request.Unvalidated 메서드를 호출합니다.

따라서 이와 같은 코드가 있으면

var lParams = aRequestContext.HttpContext.Request.Params;
if (lParams.Count > 0)
{
  ...

그것을 변경

var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated;

var lForm = lUnvalidatedRequest.Form;
if (lForm.Count > 0)
{
  ...

또는 Form유효성 검사를 실행하지 않는 속성을 사용하십시오.

var lForm = aRequestContext.HttpContext.Request.Form;
if (lForm.Count > 0)
{
  ...


답변

액션 메소드 매개 변수 ( “모델 속성”과 반대)에 html 입력을 허용해야하는 경우 이를 수행하는 기본 제공 방법이 없지만 사용자 정의 모델 바인더를 사용하여 쉽게 수행 할 수 있습니다.

public ActionResult AddBlogPost(int userId,
    [ModelBinder(typeof(AllowHtmlBinder))] string htmlBody)
{
    //...
}

AllowHtmlBinder 코드 :

public class AllowHtmlBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.HttpContext.Request;
        var name = bindingContext.ModelName;
        return request.Unvalidated[name]; //magic happens here
    }
}

내 블로그 게시물에서 전체 소스 코드와 설명을 찾으십시오. https://www.jitbit.com/alexblog/273-aspnet-mvc-allowing-html-for-particular-action-parameters/


답변

데이터의 URL 인코딩은 저에게도 효과적입니다.

예를 들면

var data = ‘<b> 안녕하세요 </ b>’

게시하기 전에 브라우저에서 encodeURIComponent (data) 호출

서버에서 HttpUtility.UrlDecode (received_data)를 호출하여 디코딩합니다.

이렇게하면 HTML을 사용할 수있는 필드 영역을 정확하게 제어 할 수 있습니다.