다음을 통해 공유


System.Xml 보안 지침

다음 단원에서는 System.Xml 응용 프로그램을 보호하기 위한 일반적인 지침을 제공합니다.

참고참고

System.Xml 구성 요소는 .NET Framework 보안 시스템을 사용합니다.이 항목에서는 XML 클래스가 특별히 처리하는 보안 문제만 다룹니다.자세한 내용은 .NET Framework의 보안을 참조하십시오.

보안 문제

일반적으로 보안 문제를 세 범주로 나눌 수 있습니다.

외부 액세스

여러 XML 기술은 처리 중 다른 문서를 검색하는 기능을 갖추고 있습니다.예를 들어, 구문 분석 중인 문서에 DTD(문서 종류 정의)가 있을 수 있습니다.또한 구문 분석 중인 문서에 참조된 외부 문서에 DTD가 있을 수도 있습니다.XSD(XML 스키마 정의 언어) 및 XSLT 기술에도 다른 파일의 정보를 포함할 수 있는 기능이 있습니다.이러한 외부 리소스에는 몇 가지 보안 문제가 있을 수 있습니다.

  • 어떤 방법으로 응용 프로그램이 신뢰할 수 있는 사이트에서만 검색하도록 하시겠습니까?예를 들어, XML 문서에 인터넷 파일에 대한 참조가 있을 경우 응용 프로그램에서 이 파일을 검색하도록 하시겠습니까?

  • 파일을 검색하는 경우 파일에 악의적인 데이터가 포함되지 않았는지 어떻게 확인하시겠습니까?

서비스 거부

XML 문서에 다른 파일에 대한 참조를 삽입할 수 있으므로 XML 문서를 구문 분석하는 데 필요한 처리 능력을 결정하기가 어렵습니다.예를 들어, XML 문서에 DTD가 포함될 수 있습니다.DTD에 중첩된 엔터티 또는 복합 내용 모델이 포함된 경우 문서를 구문 분석하는 데 엄청난 시간일 걸릴 수 있습니다.

System.Xml 클래스를 사용하여 서비스 거부 공격으로부터 보호할 수 있으므로 다음 시나리오는 서비스 거부 공격에 대해 덜 취약한 것으로 간주됩니다.System.Xml 구성 요소로 작업할 때 발생할 수 있는 보안 문제 유형과 이러한 위협 요소를 완화하는 방법은 System.Xml 보안 고려 사항을 참조하십시오.

  • 텍스트 XML 데이터를 구문 분석합니다.

  • Microsoft SQL Server 2005에서 이진 XML 데이터를 생성한 경우 이진 XML 데이터를 구문 분석합니다.

  • 데이터 소스에서 파일 시스템, 스트림, TextWriter 또는 StringBuilder로 XML 문서 및 조각을 씁니다.

  • XmlReader 개체 및 Prohibit로 설정된 DtdProcessing를 사용하는 경우 DOM(문서 개체 모델) 개체에 문서를 로드합니다.

  • DOM 개체를 탐색합니다.

서비스 거부 공격을 염려하거나 신뢰할 수 없는 환경에서 작업하는 경우 다음 시나리오를 사용하지 않는 것이 좋습니다.

  • DTD를 처리합니다.

  • 스키마를 처리합니다.여기에는 신뢰할 수 없는 스키마를 스키마 컬렉션에 추가하고 신뢰할 수 없는 스키마를 컴파일하며 신뢰할 수 없는 스키마를 사용하여 유효성을 검사하는 작업이 포함됩니다.

  • XSLT를 처리합니다.

  • 사용자가 제공한 이진 XML 데이터에서 임의의 스트림을 구문 분석합니다.

  • 하위 트리 쿼리, 편집, 문서 간 이동 및 DOM 개체 저장 등의 DOM 작업을 수행합니다.

XmlReader를 사용할 때 MaxCharactersInDocument 속성을 설정하여 구문 분석될 수 있는 문서 크기를 제한할 수 있습니다.MaxCharactersFromEntities 속성을 설정하여 확장 엔터티의 결과인 문자 수를 제한할 수 있습니다.이러한 속성 설정 예제를 보려면 적절한 참조 항목을 참고하십시오.

처리

XSD 및 XSLT 기술에는 처리 성능에 영향을 줄 수 있는 추가 기능이 있습니다.예를 들어, 상대적으로 작은 문서에서 평가되는 경우 처리하는 데 많은 시간이 필요한 XML 스키마를 만들 수 있습니다.또한 XSLT 스타일시트에 스크립트 블록을 포함할 수도 있습니다.두 가지 경우 모두 응용 프로그램에 잠재적인 보안 위협 요소가 될 수 있습니다.

보안 문제 완화 방안

다음 단원에서는 이전 보안 문제 제목에서 제기된 문제에 대한 구체적인 완화 방안을 설명합니다.

외부 리소스

XmlUrlResolver 클래스는 System.Xml 네임스페이스의 모든 클래스에 대한 기본 해결 프로그램입니다.이 클래스를 사용하여 XML 문서를 로드하고 엔터티, DTD 또는 스키마와 같은 외부 리소스를 확인하며, 지시문을 가져오거나 포함할 수 있습니다.

API를 통해 사용할 XmlResolver 개체를 지정하고 재정의할 수 있습니다.사용자가 제어하지 않거나 신뢰할 수 없는 리소스를 열어야 하는 경우에는 XmlSecureResolver 클래스를 사용합니다.XmlSecureResolverXmlResolver를 래핑하며 원본으로 사용하는 XmlResolver가 액세스하는 리소스를 제한할 수 있습니다.

DTD 처리

서비스 거부 문제가 염려되거나 신뢰할 수 없는 소스를 사용하는 경우 DTD 처리를 사용하지 마십시오.Create 메서드에서 만드는 XmlReader 개체에서는 기본적으로 DTD 처리가 비활성화됩니다.

참고참고

XmlTextReader에서는 기본적으로 DTD 처리를 허용합니다.이 기능을 비활성화하려면 XmlTextReader.DtdProcessing 속성을 사용합니다.

DTD 처리를 활성화하는 경우 XmlSecureResolver를 사용하여 XmlReader가 액세스할 수 있는 리소스를 제한할 수 있습니다.또한 응용 프로그램을 직접 디자인하여 XML 처리에 필요한 메모리 및 시간을 제한할 수 있습니다.예를 들어, ASP.NET 응용 프로그램에서 시간 제한을 구성합니다.

XSLT 처리

XslCompiledTransform 클래스를 사용하는 응용 프로그램을 만드는 경우 다음 항목 및 그 의미에 대해 알아야 합니다.

  • XSLT 스크립트는 기본적으로 비활성화되어 있습니다.XSLT 스크립트는 스크립트 지원이 필요하거나 완전히 신뢰할 수 있는 환경에서 작업하는 경우에만 활성화해야 합니다.

  • XSLT document() 함수는 기본적으로 비활성화되어 있습니다.document() 함수를 활성화하는 경우 XmlSecureResolver 개체를 Transform 메서드에 전달하여 액세스할 수 있는 리소스를 제한합니다.

  • 확장 개체는 기본적으로 활성화되어 있습니다.확장 개체가 포함된 XsltArgumentList 개체를 Transform 메서드에 전달하면 이 확장 개체가 사용됩니다.

  • XSLT 스타일시트에는 다른 파일에 대한 참조 및 포함 스크립트 블록이 포함될 수 있습니다.악의적인 사용자는 이 스타일시트를 실행할 경우 컴퓨터 리소스가 부족할 때까지 시스템에서 처리하게 만들 수 있는 데이터 또는 스타일시트를 제공하여 악용할 수 있습니다.

  • 혼합 신뢰 환경에서 XSLT 응용 프로그램을 실행하면 스타일시트가 스푸핑될 수 있습니다.예를 들어, 악의적인 사용자는 해로운 스타일시트가 포함된 개체를 로드한 후 Transform 메서드를 호출하고 변환을 실행할 다른 사용자에게 전달할 수 있습니다.

신뢰할 수 있는 소스에서 스타일시트를 가져오지 않은 경우 스크립트 또는 document() 함수를 비활성화하여 이러한 보안 문제를 완화하거나 신뢰할 수 없는 소스로부터 XslCompiledTransform 개체, XSLT 스타일시트 또는 XML 소스 데이터를 차단하여 완화할 수 있습니다.

예외 처리

더 낮은 수준의 구성 요소에서 예외가 throw되면 응용 프로그램에 노출하지 않으려는 경로 정보가 노출될 수 있습니다.응용 프로그램에서는 예외를 캐치하고 적절히 처리해야 합니다.

XmlTextWriter 사용

XmlTextWriter를 다른 응용 프로그램에 전달하면 원본으로 사용하는 스트림이 해당 응용 프로그램에 노출됩니다.XmlTextWriter를 부분 신뢰 응용 프로그램에 전달해야 할 경우 Create 메서드에서 만든 XmlWriter 개체를 대신 사용해야 합니다.

참고 항목

작업

방법: XmlSecureResolver 클래스 사용

기타 리소스

보안 및 System.Xml 응용 프로그램