Partager via


[FAQ] ASP.NET Web Pages의 Html 문자열 보안 처리 - Html.Raw와 Request.Unvalidated 처리

안녕하세요. 김대우 입니다.
최근 WebMatrix와 ASP.NET 게시판에 질문들이 무섭게 올라오는걸 보니 슬슬 발동 거시는 분들이 많이 계신 것 같습니다.

먼저 ASP.NET Web Pages와 Razor로 고생해본 경험을 살려 몇 가지 꼭 알아 두시면 좋을 내용을 FAQ로 적어 보도록 하겠습니다.
ASP.NET Web Pages는 가장 최신의 웹 개발 플랫폼이며, 안정성과 보안성을 목표로 개발 되었습니다.
가장 최신의 플랫폼인 만큼 몇가지 보안 강화 측면에서 있을 수 있는 이슈들을 미리 알아 두시면 좋습니다.

 

그 중 대표적인게 아마도 Html.Raw와 Request.Unvalidated 처리일 듯 하네요. 더 높은 보안성 제공을 위한 기본 기능이니 꼭 미리 살펴 두시길 바랍니다.
예제를 먼저 살펴 보지요.

 

<!DOCTYPE html>
<htm>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
@{
// ASP.NET Web Pages Razor에서 HTML을 찍으려면?
var str = "<b>안녕</b>";
<li>@str</li><br/>
<li>@Html.Raw(str)</li><br/>
//개발자가 의도하지 않은 HTML 출력 가능성. 보안상의 이유로 Html.Raw()를 이용 해야만 HTML처리됨.
}
<form method="post" action="">
<label for="description">글을 입력 하세요:</label>
<textarea name="description"></textarea>
<br />
<input type="submit" value="Submit"></input>
</form>
<br />
@if (IsPost) {
//검증되지 않은 HTML을 Request로 받을 경우 개발자가 의도하지 않은 잠재적인 보안 위협이 있을 수 있음.
//Textarea에 HTML 값을 넣고 테스트 하면? 마찬가지로 잠재적 보안 이슈 경고
//A potentially dangerous Request.Form value was detected from the client
//이런 경우 POST 값을 Request 하기 위해 Request.Unvalidated 를 이용.
//오류 유발을 위해, 주석을 풀고 테스트 해 보세요.
<div>
@* 입력된 내용 바로 받으면 Validation 오류 : @Request("description") *@
Validation을 사용 안함 : @Request.Unvalidated("description")
</div> }
</body>
</html>

 

예를 들면,

게시판의 글내용 부분에서 HTML 입력을 받으실 경우가 있습니다.

이때, Post받는 페이지에서 바로 Request로 받으면 “A potentially dangerous Request.Form value was detected from the client “이라는 오류와 함께 잠재적인 보안 이슈를 경고하게 됩니다.

 

기존 ASP나 PHP 기반으로 개발 하셨다면 아마도 조금 의아하실지 모르겠습니다만, 최근 XSS 와 같은 “세션 하이재킹(세션 라이딩)” 이슈를 기본적으로 방지할 수 있는 높은 보안성을 기본 제공해, 개발자가 의도하지 않은 보안 위협을 최소화 가능한 보안 기능입니다.
도움 되시길 바랍니다. – 이슈에 도움 주신 김태형님과 김수영님 감사합니다.

 

PS. web.config 를 수정해 전체 Request에 대해 검사를 안 할 수도 있지만 다양한 형태의 XSS 등의 방어를 위해 권장해 드리지 않습니다.

 

참고자료:
https://blogs.msdn.com/b/scothu/archive/2010/10/06/web-pages-beta-2-request-validation.aspx
https://www.asp.net/learn/whitepapers/aspnet4/breaking-changes#0.1__Toc256770147

https://www.sqler.com/345033