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


120

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

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

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


3
향후 방문자 : IMHO, Chris J 또는 Eugene Bosikov의 답변은 ASP.NET MVC의 최신 버전에 대해 허용되는 답변보다 낫습니다. 특히 한 필드에서만 HTML을 허용하려는 경우 더욱 그렇습니다.
lc.

답변:


163

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;}
 }

1
.NET 4를 사용하는 경우 <httpRuntime requestValidationMode="2.0" />web.config 파일 에서도 설정 해야합니다.
Charlino

3
요청 유효성 검사 모드를 다운 그레이드하지 않는 .NET 4에 대한 솔루션이 실제로 없습니까?
bzlm

20
MSDN ( msdn.microsoft.com/de-de/magazine/hh708755.aspx )은 ValidateInpute를 사용하지 말고 대신 AllowHtmlAttribute를 사용해서는 안된다고 말합니다. (Did'nt는 영어 버전을 찾을 수 없음)
알렉산더 슈미트

8
최근에 만들어진 3 개의 반대표를 수정하기 위해 수정되었습니다. 4 년 된 답변이었습니다. :)
Kelsey

1
@ djack109 일반적으로 EF 모델을 뷰 모델로 사용하지 않습니다. CRUD 작업에 대한 실제 데이터를 나타내는 별도의 클래스를 작성합니다. 이렇게하면 EF6 모델이 재생성 될 때 손실되는 것이 없습니다. 또한 당면한 작업을 수행하는 데 필요한 속성 만 갖도록 모델을 줄여야합니다.
Allen Clark Copeland Jr.

131

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


5
이것은 글로벌 행동을 변경하지 않는 훨씬 더 나은 방법 인 것 같습니다. 이 속성을 모델의 속성에 추가하여 문제를 해결했습니다.
조나단 Sayce

2
여기서 Chris 솔루션에 전적으로 동의합니다. html 입력을 허용하기 위해 모델에서 하나의 속성 만 필요한 경우 전체 애플리케이션에 대한 html 유효성 검사를 비활성화 할 이유가 없습니다. web.config에서 유효성 검사를 제거하면 앱에 큰 보안 허점이 열립니다.
Miguel

1
당신이 사용하는 경우 불행하게도이없는 작업을 수행 MetadataTypeAttribute
dav_i

@dav_i :이 솔루션은 잘 작동 MetadataTypeAttribute하며 전체 개체가 아닌 개별 필드에 대한 HTML 만 허용하므로 더 좋습니다.
Gone Coding

@ TrueBlueAussie, 저는 mvc 4.0 환경에서 몇 시간 동안 노력해 왔지만 AllowHtml이 작동해야하지만 작동하지 않습니다. 패배를 인정하고 덜 안전한 옵션 인 바지를 선택해야했습니다. AllowHtml은 나던 MetadataTypeAttribute의 사용과 작동하는 것
줄리안 붕어

42

모델에 추가 :

using System.Web.Mvc;

그리고 당신의 재산에

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

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


9

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

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

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

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

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

8

[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)
{
  ...

1
감사! Request.Unvalidated는 나를 위해 일한 유일한 솔루션이었습니다.
페터 Ivarsson이

3

액션 메소드 매개 변수 ( "모델 속성"과 반대)에 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/


1
검증되지 않음은 프레임 워크 4.5 이상에서만 사용할 수있는 것 같습니다.
Ben

@ 벤 맞아! 이 수정 된 솔루션을 확인하십시오. stackoverflow.com/questions/59483284/…
om-ha

3

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

예를 들면

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

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

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

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


지금까지 가장 쉬운 방법
N1gthm4r3

1

NopCommerce를 사용하여 E-Commerce 사이트를 개발하는 동안이 문제에 직면했으며 이전 답변과 같이 3 가지 방법 으로이 솔루션을 얻었습니다. 그러나 NopCommerce 구조에 따르면 한 번에 세 가지를 찾지 못했습니다. 나는 그들이 단지 사용 [AllowHtml]하고 있고 어떤 문제를 제외하고는 잘 작동 한다는 것을 방금 보았습니다 . 이전 질문으로 질문

개인적으로 저는 [ValidateInput(false)]안전하지 않은 전체 모델 엔티티 검사를 건너 뛰기 때문에 선호하지 않습니다 . 하지만 누군가가 글을 쓰면 여기를보세요

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

그런 다음 단일 속성 만 건너 뛰고 특정 속성 만 허용하고 다른 모든 항목을 거의 확인하지 않습니다. 그러므로 그것은 나의 것보다 선호되는 것 같다.


1

제 경우에는 AllowHtml 특성이 OutputCache 작업 필터와 결합 될 때 작동하지 않았습니다. 이 답변 은 저에게 문제를 해결했습니다. 이것이 누군가를 돕기를 바랍니다.


1

[AllowHtml]예를 들어 프로젝트에 사용할 수 있습니다.

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

이 코드를 클래스 라이브러리에 사용하려면이 패키지를 설치합니다.

Install-Package Microsoft.AspNet.Mvc

사용 후 using

using System.Web.Mvc;

0

불행히도 여기에 대한 답변 중 어느 것도 나를 위해 일하지 않았습니다.

결국 Custom Model Binding을 사용하고 타사 Sanitizer를 사용했습니다.

여기에서 내 자체 답변 질문을 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.