Рекомендации по безопасности XSLT

Язык XSLT обладает широким набором возможностей с большими возможностями и обеспечивает гибкость применения. В него входит много возможностей, которые полезны, но могут злонамеренно использоваться внешними источниками. Чтобы использовать XSLT безопасно, необходимо иметь представление о проблемах безопасности, сопряженных с использованием XSLT, и основных стратегиях, применяемых для снижения этих рисков.

Расширения XSLT

Двумя популярными расширениями XSLT являются скрипты в таблице стилей и объекты расширения. Эти расширения позволяют процессору XSLT выполнять программный код.

  • Объекты расширения добавляют возможности программирования к преобразованиям XSL.

  • Можно внедрять скрипты в таблицу стилей с помощью элемента расширения msxsl:script.

Объекты расширения

Расширяемые объекты добавляются с помощью метода AddExtensionObject. Для поддержки расширяемых объектов необходим набор разрешений FullTrust. Это гарантирует, что во время выполнения кода из расширяемого объекта не произойдет повышение разрешений. Попытка вызова метода AddExtensionObject при отсутствии разрешений FullTrust приведет к исключению безопасности.

Скрипты в таблицах стилей

Можно внедрять скрипты в таблицу стилей с помощью расширяемого элемента msxsl:script. Поддержка скриптов является дополнительной функцией класса XslCompiledTransform, которая по умолчанию отключена. Чтобы включить скрипты, установите свойство XsltSettings.EnableScript в значение true и передайте объект XsltSettings методу Load.

Примечание.

Блоки скриптов поддерживаются только в .NET Framework. Они не поддерживаются в .NET Core или .NET 5 или более поздней версии.

Рекомендации

Включайте скрипты только в том случае, если таблица стилей получена из доверенного источника. Если нельзя проверить источник таблицы стилей или таблица стилей получена из ненадежного источника, передайте значение null для аргумента параметров XSLT.

Внешние ресурсы

Язык XSLT обладает возможностями, такими как xsl:import, xsl:include и document(), в которых процессору необходимо разрешать URI-ссылки. Класс XmlResolver используется для разрешения внешних ресурсов. Внешние ресурсы может понадобиться разрешать в следующих двух случаях:

  • если во время компиляции таблицы стилей для разрешения XmlResolver и xsl:import используется объект xsl:include;

  • если во время выполнения преобразования для разрешения функции XmlResolver используется объект document().

    Примечание.

    Функция document() по умолчанию отключена в классе XslCompiledTransform. Чтобы включить эту возможность, установите свойство XsltSettings.EnableDocumentFunction в значение true и передайте объект XsltSettings методу Load.

Методы Load и Transform имеют перегруженные версии, принимающие объект XmlResolver в качестве одного из аргументов. Если XmlResolver не указан, используется XmlUrlResolver по умолчанию без учетных данных.

Рекомендации

Включайте функцию document() только в том случае, если таблица стилей получена из доверенного источника.

Следующий список описывает, когда может потребоваться указать объект XmlResolver:

  • Если процессу XSLT требуется доступ к сетевому ресурсу, требующему проверки подлинности, можно использовать XmlResolver с необходимыми учетными данными.

  • Если необходимо ограничить ресурсы, к которым имеет доступ процесс XSLT, можно использовать XmlSecureResolver с надлежащим набором разрешений. Использовать класс XmlSecureResolver рекомендуется, если вам необходимо открыть ресурс, которым вы не управляете или к которому нет доверия.

  • Если необходимо настроить поведение особым образом, можно реализовать собственный класс XmlResolver и использовать его для разрешения ресурсов.

  • Если необходимо убедиться в отсутствии доступа к внешним ресурсам, можно указать null в качестве значения аргумента XmlResolver.

См. также