IT

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

lottoking 2020. 7. 21. 07:41
반응형

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


사용자가 ASP.net MVC를 사용하여 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요청에 액세스 하는 클래스가 있으므로 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)
{
  ...

action-method 매개 변수 ( "모델 속성"과 반대 )에 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/


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

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

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

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


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


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

예를 들면

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

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

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

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

참고 URL : https://stackoverflow.com/questions/3621272/allow-user-to-input-html-in-asp-net-mvc-validateinput-or-allowhtml

반응형