다음을 통해 공유


CA3076: 안전하지 않은 XSLT 스크립트 실행

속성
규칙 ID CA3076
제목 XSLT 스크립트 실행이 안전하지 않습니다.
범주 보안
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 9에서 기본적으로 사용 아니요

원인

.NET 애플리케이션에서 비보안 방식으로 XSLT(Extensible Stylesheets Language Transformations)를 실행하는 경우 프로세서는 공격자에게 중요한 정보를 노출하여 서비스 거부 및 사이트 간 공격을 유발할 수 있는 신뢰할 수 없는 URI 참조를 확인할 수 있습니다. 자세한 내용은 XSLT 보안 고려 사항(.NET 가이드)을 참조하세요.

규칙 설명

XSLT 는 XML 데이터를 변환하기 위한 W3C(World Wide Web 콘소시엄) 표준입니다. XSLT는 XML 데이터를 HTML, 고정 길이 텍스트, 쉼표로 구분된 텍스트, 기타 XML 형식 등의 다른 형식으로 변환하기 위한 스타일시트를 작성하는 데 일반적으로 사용됩니다. 이 기능은 프로젝트에서 기본적으로는 금지되어 있지만 사용하도록 설정할 수 있습니다.

공격 영역을 노출하지 않도록 하기 위해 이 규칙은 XslCompiledTransform.Load 가 안전하지 않은 XsltSettingsXmlResolver인스턴스가 함께 수신될 때마다 트리거되어 악성 스크립트를 처리합니다.

위반 문제를 해결하는 방법

  • 안전하지 않은 XsltSettings 인수를 XsltSettings.Default 또는 문서 함수 및 스크립트 실행을 사용하지 않도록 하는 인스턴스로 바꿉니다.

  • XmlResolver 인수를 null 또는 XmlSecureResolver 인스턴스로 바꿉니다.

경고를 표시하지 않는 경우

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

경고 표시 안 함

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

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

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

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

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

의사 코드 예제

XsltSettings.TrustedXslt를 사용하는 위반

using System.Xml;
using System.Xml.Xsl;

namespace TestNamespace
{
    class TestClass
    {
         void TestMethod()
        {
             XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
             var settings = XsltSettings.TrustedXslt;
             var resolver = new XmlUrlResolver();
             xslCompiledTransform.Load("testStylesheet", settings, resolver); // warn
        }
    }
}

XsltSettings.Default를 사용하는 해결 방법

using System.Xml;
using System.Xml.Xsl;

namespace TestNamespace
{
    class TestClass
    {
        void TestMethod()
        {
            XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
            var settings = XsltSettings.Default;
            var resolver = new XmlUrlResolver();
            xslCompiledTransform.Load("testStylesheet", settings, resolver);
        }
    }
}

위반 - 문서 함수 및 스크립트 실행을 사용하지 않도록 설정하지 않음

using System.Xml;
using System.Xml.Xsl;

namespace TestNamespace
{
    class TestClass
    {
        private static void TestMethod(XsltSettings settings)
        {
            try
            {
                XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
                var resolver = new XmlUrlResolver();
                xslCompiledTransform.Load("testStylesheet", settings, resolver); // warn
            }
            catch { throw; }
            finally { }
        }
    }
}

솔루션 - 문서 함수 및 스크립트 실행 사용 안 함

using System.Xml;
using System.Xml.Xsl;

namespace TestNamespace
{
    class TestClass
    {
        private static void TestMethod(XsltSettings settings)
        {
            try
            {
                XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
                settings.EnableDocumentFunction = false;
                settings.EnableScript = false;
                var resolver = new XmlUrlResolver();
                xslCompiledTransform.Load("testStylesheet", settings, resolver);
            }
            catch { throw; }
            finally { }
        }
    }
}

참고 항목