Поделиться через


Рекомендации по безопасности System.Xml

В следующих разделах приведены общие рекомендации по защите приложений System.Xml.

ПримечаниеПримечание

Компоненты System.Xml используют систему безопасности .NET Framework.В этом разделе рассматриваются только вопросы безопасности, специально обрабатываемые классами XML.Дополнительные сведения см. в разделе Безопасность в .NET Framework.

Проблемы безопасности

Проблемы безопасности можно разделить на три общие категории.

Внешний доступ

Несколько XML-технологий позволяют получать в ходе обработки другие документы.Например, определение типа документа (DTD) может находиться в документе, для которого выполняется синтаксический анализ.DTD может также находиться во внешнем документе, на который ссылается анализируемый документ.Язык XSD и технологии XSLT также позволяют включать сведения из других файлов.С внешними ресурсами могут быть связаны некоторые проблемы безопасности:

  • Как обеспечить получение приложением файла только от доверенных узлов?Например, если XML-документ имеет ссылку на файл из Интернета, должно ли приложение получать этот файл?

  • Если файл все-таки получен, то как убедиться, что он не содержит вредоносных данных?

Отказ в обслуживании

XML-документы могут содержать ссылки на другие файлы, поэтому трудно определить, сколько вычислительных ресурсов потребуется для синтаксического анализа XML-документа.Например, XML-документы могут содержать DTD.Если DTD содержит сущности или сложные модели содержимого, то для синтаксического анализа документа может потребоваться слишком много времени.

Следующие сценарии считаются менее уязвимыми для атак типа «отказ в обслуживании», так как классы System.Xml обеспечивают средства защиты от таких атак.Дополнительные сведения о типах проблем безопасности при работе с компонентами System.Xml и мерах по уменьшению этих угроз см. в разделе Рекомендации по безопасности System.Xml.

  • Синтаксический анализ текстовых XML-данных.

  • Синтаксический анализ двоичных XML-данных, если двоичные XML-данные были созданы с помощью Microsoft SQL Server 2005.

  • Запись XML-документов и фрагментов из источников данных в файловую систему, потоки, TextWriter или StringBuilder.

  • Загрузка документов в объект DOM, если используется объект XmlReader, а свойство DtdProcessing имеет значение Prohibit.

  • Навигация по объекту DOM.

Приведенные ниже сценарии использовать не рекомендуются, если есть угроза атак типа «отказ в обслуживании» или при работе в ненадежной среде.

  • Обработка DTD.

  • Обработка схем.Сюда относится добавление в коллекцию схем схемы без доверия, компиляция схемы без доверия и проверка с использованием схемы без доверия.

  • Обработка XSLT.

  • Синтаксический анализ произвольного потока предоставленных пользователем двоичных XML-данных.

  • DOM-операции, например запросы, изменение, перемещение поддеревьев между документами и сохранение объектов DOM.

При использовании XmlReader можно ограничить размер документа, который может быть подвергнут синтаксическому анализу, задав свойство MaxCharactersInDocument.Можно ограничить число символов, появляющихся в результате раскрытия сущностей, задав свойство MaxCharactersFromEntities.Примеры настройки этих свойств см. в соответствующих разделах справки.

Обработка

Технологии XSD и XSLT имеют дополнительные возможности, которые могут влиять на производительность при обработке.Например, можно построить схему XML, для обработки которой даже при сравнительно небольшом размере документа потребуется значительное время.Кроме того, можно внедрять блоки скриптов в таблицу стилей XSLT.В обоих случаях существует потенциальная угроза безопасности приложения.

Устранение проблем безопасности

В следующих разделах подробно описано решение проблем, представленных в предыдущем разделе «Проблемы безопасности».

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

Класс XmlUrlResolver является арбитром по умолчанию для всех классов пространства имен System.Xml.Он используется для загрузки XML-документов и для разрешения таких внешних ресурсов, как сущности, DTD или схемы, а также для импорта или включения директив.

Переопределить это можно с помощью API-интерфейсов. Для этого нужно указать нужный объект XmlResolver.Использовать класс XmlSecureResolver рекомендуется, если вам необходимо открыть ресурс, которым вы не управляете или к которому нет доверия.Класс XmlSecureResolver упаковывает объект XmlResolver и позволяет ограничить ресурсы, доступные для базового объекта XmlResolver.

Обработка DTD

Не включайте обработку DTD, если есть опасность атак типа «отказ в обслуживании» или если ведется работа с ненадежными источниками.Обработка DTD по умолчанию отключена в объектах XmlReader, созданных методом Create.

ПримечаниеПримечание

Класс XmlTextReader по умолчанию разрешает обработку DTD.Чтобы отключить эту функцию, воспользуйтесь свойством XmlTextReader.DtdProcessing.

Если обработка DTD включена, то с помощью класса XmlSecureResolver можно ограничить ресурсы, доступные для объекта XmlReader.Кроме того, можно создать собственное приложение, ограничивающее объем памяти и время, выделяемое на обработку XML.Например, можно ограничить время ожидания в приложении ASP.NET.

Обработка XSLT

При создании приложения, использующего класс XslCompiledTransform, помните о следующих особенностях и их последствиях:

  • Скрипты XSLT отключены по умолчанию.Скрипты XSLT следует включать только при необходимости в поддержке скриптов и при работе в полностью доверенной среде.

  • Функция XSLT document() отключена по умолчанию.Если функция document() включена, ограничьте ресурсы, к которым можно получить доступ путем передачи объекта XmlSecureResolver методу Transform.

  • Объекты расширения по умолчанию включены.Если методу Transform передается объект XsltArgumentList, содержащий объекты расширения, то используются объекты расширения.

  • Таблицы стилей XSLT могут содержать ссылки на другие файлы и внедренные блоки скриптов.Этим может воспользоваться злонамеренный пользователь: он может передать такие данные или таблицы стилей, которые при выполнении будут задействовать все доступные ресурсы компьютера.

  • Приложения XSLT, которые выполняются в среде со смешанным уровнем доверия, могут привести к подделке таблицы стилей.Например, злонамеренный пользователь может загрузить объект с вредоносной таблицей стилей и передать ее другому пользователю, который впоследствии вызовет метод Transform и выполнит преобразование.

Чтобы избежать этих проблем безопасности, не следует включатьскрипты или функцию document(), если таблица стилей поступает не из надежного источника, а также не следует принимать объекты XslCompiledTransform, таблицы стилей XSLT или исходные XML-данные из ненадежных источников.

Обработка исключений

Исключения, вызванные компонентами нижнего уровня, могут открыть доступ к данным о пути, которые не должны быть доступны приложению.Приложения должны перехватывать исключения и обрабатывать их соответствующим образом.

Использование XmlTextWriter

Если объект XmlTextWriter передается другому приложению, то этому приложению становится доступен базовый поток.Если нужно передать XmlTextWriter приложению с частичным доверием, то следует использовать объект XmlWriter, созданный методом Create.

См. также

Задачи

Как использовать класс XmlSecureResolver

Другие ресурсы

Безопасность и приложения System.Xml