| 속성 | 값 |
|---|---|
| 규칙 ID | CA3076 |
| 제목 | XSLT 스크립트 실행이 안전하지 않습니다. |
| 범주 | 보안 |
| 수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
| .NET 10에서 기본적으로 사용하도록 설정 | 아니요 |
원인
.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 명시적으로 설정할 필요가 없습니다.
참고 항목
.NET