Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA3076 |
| Заголовок | Выполнение небезопасного скрипта XSLT |
| Категория | Безопасность |
| Исправление является критическим или не критическим | Не критическое |
| Включен по умолчанию в .NET 10 | No |
Причина
Если вы выполняете расширяемые преобразования стилей (XSLT) в приложениях .NET небезопасно, обработчик может разрешить ненадежные ссылки URI, которые могут раскрывать конфиденциальную информацию злоумышленникам, что приводит к отказу в обслуживании и межсайтовых атаках. Дополнительные сведения см. в руководстве по безопасности XSLT (руководство по .NET).
Описание правила
XSLT — это стандарт консорциума W3C для преобразования данных XML. 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 , так как выполнение скрипта не поддерживается.