AJAX
를 통해 서버로 POST
요청시 Controller
로 넘어가지도 못하고 오류가 발생했습니다.
이때 서버로 넘긴 값에 특수문자가 포함되어 있었고 이에 따른 문제였습니다.
서버로 값을 전달할 때 POST
요청시 특수문자나 인코딩 되지 않은 HTML
콘텐츠(<
,>
)가 포함되어 있으면 발생하는 오류입니다.
클라이언트에서 이러한 값이 포함된 내용을 전송 받을 경우 XSS(Cross-site scription)
SQL Injection
공격 같이 보안적인 이슈가 발생하기 때문에 .NET 기반 웹 기술(ASP.NET, MVC, Razor)의 기본설정에서 막고 있습니다.
즉, 서버에 전송 된 특수문자나 인코딩 되지 않은 HTML
콘텐츠를 처리 하지 못하도록 하는 ASP.NET의 요청 유효성 검사 기능에 의해 서버로의 요청이 취소(Controller
로 넘어가지 못함) 됩니다.
모든 입력 데이터의 유효성을 명시적으로 검사하고 적절한 경우 HTML
로 인코딩하는 것이 좋습니다.
하지만, 그렇게 하지 못할 경우 페이지에서 요청 유효성 검사 기능을 사용 하지 않도록 설정할 수 있습니다.
(요청 유효성 검사 기능을 사용하지 않을 경우 콘텐츠를 제대로 인코드 또는 처리하는지 확인하는 것은 페이지 개발자의 책임입니다.)
요청 유효성 검사 기능을 사용하지 않도록 설정할 수 있는 범위는 전체 응용 프로그램부터 각 프로퍼티까지 다양하게 선택할 수 있습니다.
web.config
에서 전체POST
요청에 특수문자나 인코딩 되지 않은 HTML
콘텐츠를 허용합니다.
<configuration>
<appSettings/>
<system.web>
<pages validateRequest="false" />
</system.web>
</configuration>
💥 하지만 이 방법은 모든 요청이 허용되므로 보안적인 이슈에 있어 안전하지 않으므로 주의해 사용해야 합니다.
에러 발생 페이지에 ValidateInput
속성을 추가합니다.
<%@ Page language="C#" ... validateRequest="false">
Controller
에 ValidateInput
어노테이션을 false
로 추가합니다.
[HttpPost]
[ValidateInput(false)]
// [HttpPost, ValidateInput(false)] 같은 줄에 함께 사용 가능
public ActionResult Edit(Object obj)
{
CommonRes res = CommonRes.NoRole();
return Json(res, JsonRequestBehavior.AllowGet);
}
특정 프로퍼티에 AllowHtml
어노테이션을 적용합니다.
[AllowHtml]
public string title { get; set; }