요청 유효성 검사 - 스크립트 공격 방지

이 문서에서는 기본적으로 애플리케이션이 서버에 제출된 인코딩되지 않은 HTML 콘텐츠를 처리할 수 없는 ASP.NET 요청 유효성 검사 기능을 설명합니다. 애플리케이션이 HTML 데이터를 안전하게 처리하도록 설계된 경우 이 요청 유효성 검사 기능을 사용하지 않도록 설정할 수 있습니다.

ASP.NET 1.1 및 ASP.NET 2.0에 적용됩니다.

버전 1.1부터 ASP.NET 기능 중 하나인 요청 유효성 검사는 서버에서 인코딩되지 않은 HTML을 포함한 콘텐츠를 허용하지 않도록 방지합니다. 이 기능은 클라이언트 스크립트 코드 또는 HTML을 무의식적으로 서버에 제출하고 저장한 다음 다른 사용자에게 제공할 수 있는 스크립트 삽입 공격을 방지하도록 설계되었습니다. 모든 입력 데이터의 유효성을 검사하고 적절한 경우 HTML로 인코딩하는 것이 좋습니다.

예를 들어 사용자의 전자 메일 주소를 요청한 다음 해당 이메일 주소를 데이터베이스에 저장하는 웹 페이지를 만듭니다. 사용자가 유효한 전자 메일 주소 대신 SCRIPT 경고("hello from script>")</SCRIPT>를 입력<하는 경우 해당 데이터가 표시되면 콘텐츠가 제대로 인코딩되지 않은 경우 이 스크립트를 실행할 수 있습니다. ASP.NET 요청 유효성 검사 기능을 사용하면 이러한 일이 발생하지 않습니다.

이 기능이 유용한 이유

많은 사이트는 간단한 스크립트 삽입 공격에 열려 있다는 것을 인식하지 못하고 있습니다. 이러한 공격의 목적이 HTML을 표시하여 사이트를 훼손하거나 잠재적으로 클라이언트 스크립트를 실행하여 사용자를 해커 사이트로 리디렉션하는 것이든, 스크립트 삽입 공격은 웹 개발자가 해결해야 하는 문제입니다.

스크립트 삽입 공격은 ASP.NET, ASP 또는 기타 웹 개발 기술을 사용하는 모든 웹 개발자의 관심사입니다.

ASP.NET 요청 유효성 검사 기능은 개발자가 해당 콘텐츠를 허용하기로 결정하지 않는 한 서버에서 인코딩되지 않은 HTML 콘텐츠를 처리할 수 없도록 하여 이러한 공격을 사전에 방지합니다.

예상할 사항: 오류 페이지

아래 스크린샷은 몇 가지 샘플 ASP.NET 코드를 보여줍니다.

ASP.NET 코드 샘플을 보여 주는 스크린샷

이 코드를 실행하면 텍스트 상자에 텍스트를 입력하고 단추를 클릭한 다음 레이블 컨트롤에 텍스트를 표시할 수 있는 간단한 페이지가 생성됩니다.

이 코드를 실행하면 텍스트 상자에 텍스트를 입력하고, 단추를 클릭하고, 레이블 컨트롤에 텍스트를 표시할 수 있는 간단한 페이지가 표시되는 스크린샷

그러나 JavaScript(예: <script>alert("hello!")</script> 를 입력하고 제출해야 하는 경우)에는 예외가 발생합니다.

JavaScript를 입력하고 제출하면 예외가 발생합니다.

오류 메시지는 '잠재적으로 위험한 Request.Form 값이 검색되었습니다.'라고 표시하고 정확히 발생한 내용과 동작을 변경하는 방법에 대한 자세한 정보를 설명에 제공합니다. 예를 들면 다음과 같습니다.

요청 유효성 검사에서 잠재적으로 위험한 클라이언트 입력 값을 감지했으며 요청 처리가 중단되었습니다. 이 값은 사이트 간 스크립팅 공격과 같은 애플리케이션의 보안을 손상시키려는 시도를 나타낼 수 있습니다. Page 지시문 또는 구성 섹션에서 를 설정 validateRequest=false 하여 요청 유효성 검사를 사용하지 않도록 설정할 수 있습니다. 그러나 이 경우 애플리케이션에서 모든 입력을 명시적으로 검사 것이 좋습니다.

페이지에서 요청 유효성 검사를 사용하지 않도록 설정

페이지에서 요청 유효성 검사를 사용하지 않도록 설정하려면 Page 지시문false의 특성을 로 설정 validateRequest 해야 합니다.

<%@ Page validateRequest="false" %>

주의

요청 유효성 검사를 사용하지 않도록 설정하면 페이지에 콘텐츠를 제출할 수 있습니다. 콘텐츠가 제대로 인코딩되거나 처리되도록 하는 것은 페이지 개발자의 책임입니다.

애플리케이션에 대한 요청 유효성 검사 사용 안 됨

애플리케이션에 대한 요청 유효성 검사를 사용하지 않도록 설정하려면 애플리케이션에 대한 Web.config 파일을 수정하거나 만들고 섹션false<pages /> validateRequest 특성을 로 설정해야 합니다.

<configuration>
   <system.web>
      <pages validateRequest="false" />
   </system.web>
</configuration>

서버의 모든 애플리케이션에 대한 요청 유효성 검사를 사용하지 않으려면 Machine.config 파일을 수정할 수 있습니다.

주의

요청 유효성 검사를 사용하지 않도록 설정하면 콘텐츠를 애플리케이션에 제출할 수 있습니다. 콘텐츠가 제대로 인코딩되거나 처리되도록 하는 것은 애플리케이션 개발자의 책임입니다.

아래 코드는 요청 유효성 검사를 해제하도록 수정되었습니다.

아래 코드가 요청 유효성 검사를 해제하도록 수정되었음을 보여 주는 스크린샷

이제 다음 JavaScript를 텍스트 상자에 <script>alert("hello!")</script> 입력하면 결과는 다음과 같습니다.

JavaScript가 텍스트 상자에 입력되었는지를 보여 주는 스크린샷: 결과는

이 문제가 발생하지 않도록 하려면 요청 유효성 검사가 해제된 상태에서 콘텐츠를 HTML로 인코딩해야 합니다.

콘텐츠를 HTML로 인코딩하는 방법

요청 유효성 검사를 사용하지 않도록 설정한 경우 나중에 사용할 수 있도록 저장될 HTML 인코딩 콘텐츠를 사용하는 것이 좋습니다. HTML 인코딩은 모든 '' 또는 '<>'(다른 여러 기호와 함께)를 해당 HTML 인코딩 표현으로 자동으로 바꿉니다. 예를 들어 '<'은 '<'로 대체되고 '>'은 '>'으로 대체됩니다. 브라우저는 이러한 특수 코드를 사용하여 브라우저에 '<' 또는 '>'를 표시합니다.

API를 사용하여 서버에서 콘텐츠를 HTML로 쉽게 인코딩할 Server.HtmlEncode(string) 수 있습니다. 콘텐츠를 쉽게 HTML 디코딩할 수 있습니다. 즉, 메서드를 사용하여 Server.HtmlDecode(string) 표준 HTML로 되돌릴 수 있습니다.

Server.HtmlEncode(문자열) API를 사용하여 서버에서 콘텐츠를 HTML로 쉽게 인코딩할 수 있음을 보여 주는 스크린샷 콘텐츠를 쉽게 HTML 디코딩할 수 있습니다. 즉, Server.HtmlDecode(string) 메서드를 사용하여 표준 HTML로 되돌릴 수 있습니다.

결과는 다음과 같습니다.

텍스트 상자에