Рекомендации по кодированию System.Xml

Обновлен: November 2007

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

ms172416.alert_note(ru-ru,VS.90).gifПримечание.

Компоненты System.Xml полагаются на систему безопасности Microsoft .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, а свойство ProhibitDtd имеет значение true.

  • Навигация по объекту 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.

ms172416.alert_note(ru-ru,VS.90).gifПримечание.

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

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

Обработка XSLT

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

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

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

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

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

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

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

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

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

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

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

См. также

Задачи

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

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

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