이전의 ASP.NET 3.5까지에서는, 간단하게 <%= expression %>(일반적으로, 코드 너겟이라 불리는)를 사용하여 응답에 대한 텍스트를 화면에 출력하였습니다. 이러한 코드 너겟을 사용하는 경우, 개발자들은 쉽게 HTML에 대한 인코딩을 잊어버리기 쉽상입니다. 이러한 경우, 이러한 방법으로 코드 너겟을 작성한 페이지는 쉽게 XSS(크로스 사이트 스크립팅, Cross Site Scripting) 공격에 노출되게 됩니다.
쉽게 예를 들어보도록 하겠습니다. 웹 폼에서 코드 비하인드에 작성되어 있는 메서드인 GetContent()라는 메서드를 코드 너겟을 사용하여 호출하고 있으며, GetContent() 메서드는 다음과 같이 구성되어 있다고 생각해 보겠습니다.
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
Result by Calling CodeBehind Method : <%=GetContent()%>
</asp:Content>
public string GetContent()
{ string content = "<script language='javascript'>alert('Script Alert');</script>"; content += "<p>Microsoft ASP.NET is a free technology that allows programmers to create dynamic web applications.</p>";
return content;
}
위의 코드가 작성된 페이지를 띄워보면 HTML 인코딩을 하지 않았기 때문에, GetContent() 메서드에 정의된 스크립트가 실행됩니다. 따라서, <그림 1>와 같은 결과가 발생됩니다.
<그림 1> 스크립트가 실행되는 화면
따라서, 이와 같이 스크립트가 실행되는 것을 방지하기 위해서는 HTML 인코딩이 필요하며, HTML 인코딩을 하기 위해서는 HttpUtility 클래스에 있는 HtmlEncode() 메서드를 이용하면 됩니다.
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
Result by Calling CodeBehind Method : <%=HttpUtility.HtmlEncode(GetContent())%>
</asp:Content>
ASP.NET 4에서는 이러한 실수를 피하기 위해 새로운 코드 표현식인 <%: expression %>이 추가되었습니다. <%: expression %> 표현식을 사용하게 되면, 위에서 설명하였던 HttpUtility.HtmlEncode() 메서드를 호출하였던 결과와 동일합니다.
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
Result by Calling CodeBehind Method : <%: GetContent()%>
</asp:Content>
하지만, 새로운 코드 표현식을 사용하게 된다면 HTML 인코딩이 기본적으로 적용되므로, 이렇게 HTML 인코딩을 하지 않으려는 경우에는 마찬가지로 새롭게 ASP.NET 4에 추가된 HtmlString 클래스를 사용하면 됩니다.
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
Result by Calling CodeBehind Method : <%: new HtmlString(GetContent())%>
</asp:Content>
하지만, 이 새로운 코드 표현식만으로 XSS 공격을 막을 수 있다고는 생각하지 않는 것이 좋으며, 개발자 스스로 이러한 공격에 대처할 수 있도록 코드를 작성해야 할 것입니다.

이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.