Share via


CA3077: API 디자인, XML 문서 및 XML 텍스트 판독기의 안전하지 않은 처리

속성
규칙 ID CA3077
타이틀 API 디자인, XML 문서 및 XML 텍스트 판독기의 처리가 안전하지 않습니다.
범주 보안
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 아니요

원인

XMLDocument 및 XMLTextReader에서 파생된 API를 디자인할 경우 DtdProcessing에 주의해야 합니다. 외부 엔터티 소스를 참조하거나 확인할 때 안전하지 않은 DTDProcessing 인스턴스를 사용하거나 XML에서 안전하지 않은 값을 설정하면 정보가 공개될 수 있습니다.

규칙 설명

DTD(문서 종류 정의) 는 XML 파서가 W3C(World Wide Web Consortium) XML(Extensible Markup Language) 1.0에 정의된 대로 문서의 유효성을 확인할 수 있는 두 가지 방법 중 하나입니다. 이 규칙은 신뢰할 수 없는 데이터가 허용되는 속성 및 인스턴스를 찾아 DoS(서비스 거부) 공격을 야기할 수 있는 잠재적인 Information Disclosure 위협을 개발자에게 경고합니다. 다음 경우에 이 규칙이 트리거됩니다.

  • XmlDocument 또는 XmlTextReader 클래스는 DTD 처리를 위해 기본 확인자 값을 사용합니다.

  • XmlDocument 또는 XmlTextReader 파생 클래스에 대해 정의된 생성자가 없거나 XmlResolver에 대해 보안 값이 사용되지 않습니다.

위반 문제를 해결하는 방법

  • 모든 XmlTextReader 예외를 catch하고 적절히 처리하여 경로 정보가 공개되지 않도록 합니다.

  • XmlResolver 대신 XmlSecureResolver를 사용하여  XmlTextReader에서 액세스할 수 있는 리소스를 제한할 수 있습니다.

경고를 표시하지 않는 경우

입력 출처를 신뢰할 수 있는지 확신할 수 없으면 이 경고의 규칙이 표시되지 않도록 설정하지 않도록 합니다.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

#pragma warning disable CA3077
// The code that's violating the rule is on this line.
#pragma warning restore CA3077

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none으로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA3077.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

의사 코드 예제

위반

using System;
using System.Xml;

namespace TestNamespace
{
    class TestClass : XmlDocument
    {
        public TestClass () {} // warn
    }

    class TestClass2 : XmlTextReader
    {
        public TestClass2() // warn
        {
        }
    }
}

해결 방법

using System;
using System.Xml;

namespace TestNamespace
{
    class TestClass : XmlDocument
    {
        public TestClass ()
        {
            XmlResolver = null;
        }
    }

    class TestClass2 : XmlTextReader
    {
        public TestClass2()
        {
               XmlResolver = null;
        }
    }
}