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

속성 값
규칙 ID CA3076
제목 XSLT 스크립트 실행이 안전하지 않습니다.
범주 보안
수정 사항이 호환성을 깨뜨리는지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 아니요
적용 가능한 언어 C# 및 Visual Basic

원인

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

규칙 설명

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

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

위반 문제를 해결하는 방법

  • 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 { }
        }
    }
}

비고

.NET 10부터 EnableScript 속성은 사용되지 않는 것으로 표시되며, 경고 SYSLIB0062를 생성합니다. .NET(Core)에서는 스크립트 실행이 지원되지 않으므로 이 속성을 false 명시적으로 설정할 필요가 없습니다.

참고하기