Рекомендации по безопасности System.Xml
Обновлен: November 2007
В следующих разделах рассказывается о проблемах безопасности, которые могут возникнуть при работе с компонентами System.Xml, а также о том, что можно сделать, чтобы уменьшить эти угрозы.
Примечание. |
---|
Компоненты System.Xml полагаются на систему безопасности Microsoft .NET Framework. В этом разделе рассматриваются только вопросы безопасности, специально обрабатываемые классами XML. Дополнительные сведения см. в разделе Безопасность в .NET Framework. |
Класс XmlResolver
Классы XmlReader и XmlReaderSettings
Класс XmlTextReader
Класс XslCompiledTransform
Document Object Model
Класс XmlResolver
Класс XmlResolver используется для разрешения ресурсов. Он используется для загрузки XML-документов и для разрешения таких внешних ресурсов, как сущности, DTD или схемы, а также для импорта или включения директив. .NET Framework содержит две реализации класса XmlResolver.
Класс XmlUrlResolver является арбитром по умолчанию для всех классов пространства имен System.Xml. Поддерживаются протоколы file:// и http:// и запросы из класса WebRequest. Во многих случаях, если не указать объект XmlResolver, который должен использоваться в приложении, для доступа к XML-ресурсам используется объект XmlUrlResolver без пользовательских учетных данных.
Класс XmlSecureResolver помогает защитить другой объект XmlResolver, заключая объект XmlResolver в обертку и ограничивая ресурсы, к которым имеет доступ базовый XmlResolver. Например, класс XmlSecureResolver может запрещать доступ к определенным узлам или зонам Интернета.
При работе с классом XmlResolver необходимо учитывать следующие замечания.
Объекты XmlResolver могут содержать конфиденциальные сведения, например учетные данные пользователей, которые можно использовать, чтобы получить доступ и получить данные. При кэшировании объектов XmlResolver нужно соблюдать осторожность, не следует передавать объект XmlResolver ненадежным компонентам, поскольку такой компонент может использовать объект XmlResolver и его учетные данные для получения доступа к данным.
При разработке свойства класса, в котором используется класс XmlResolver, оно должно быть определено как свойство, доступное только для записи. Это свойство можно использовать, чтобы указывать используемый объект XmlResolver, однако его нельзя использовать, чтобы вернуть объект XmlResolver. Это позволит ненадежным компонентам использовать этот класс, но не даст им возможности получать и непосредственно использовать объект XmlResolver.
Если приложение принимает объекты XmlResolver от недоверенного кода, то нельзя предполагать, что URI, переданный в метод GetEntity, является тем же, который был возвращен методом ResolveUri. Классы, являющиеся производными от класса XmlResolver, могут переопределять метод GetEntity и возвращать данные, отличающиеся от тех, которые содержались в исходном URI.
Приложение может уменьшить опасность атак типа «отказ в обслуживании», когда методу GetEntity отказывается в доступе к памяти, путем упаковывания, реализуемого интерфейсом IStream, который ограничивает считываемое число байтов. Это помогает защититься от ситуаций, когда вредоносный код пытается передать бесконечный поток байтов методу GetEntity.
Классы XmlReader и XmlReaderSettings
Практически все компоненты System.Xml построены на концепции синтаксического анализа XML-данных. Например, класс XmlDocument использует класс XmlReader, чтобы анализировать документ и создавать представление XML-документа в памяти.
Рекомендуется использовать метод Create для создания объектов XmlReader. Класс XmlReaderSettings указывает, какие функции необходимо включить в объекте XmlReader.
Ограничение размера документа и размера раскрытия сущности
Объем памяти, который требуется приложению, использующему объект XmlReader, может соотноситься с размерами анализируемого XML-документа. Одна из форм атаки типа «отказ в обслуживании» заключается в передаче для синтаксического анализа чрезмерно больших XML-документов.
При использовании XmlReader можно ограничить размер документа, который может быть подвергнут синтаксическому анализу, задав свойство MaxCharactersInDocument. Можно ограничить число символов, появляющихся в результате раскрытия сущностей, задав свойство MaxCharactersFromEntities. Примеры настройки этих свойств см. в соответствующих разделах справки.
Обработка DTD
Обработка DTD может привести к атаке DoS. Например, определение DTD может содержать вложенные сущности или сложные модели содержимого, на обработку которых может уйти слишком много времени.
Обработка DTD по умолчанию отключена. Если объект XmlReader обнаруживает данные DTD, возникает исключение XmlException.
Обработка схем
Флаги проверки ProcessInlineSchema и ProcessSchemaLocation объекта XmlReaderSettings по умолчанию не установлены. Это позволяет защитить объект XmlReader от атак на основе схем при обработке XML-данных из ненадежного источника. Если эти флаги установлены, для разрешения расположения схем, обнаруженных в экземпляре документа в объекте XmlReader, используется арбитр XmlResolver объекта XmlReaderSettings. Если свойство XmlResolver имеет значение null, расположения схем не разрешаются, даже если установлены флаги проверки ProcessInlineSchema и ProcessSchemaLocation.
Схемы, добавленные во время проверки, добавляют новые типы и могут изменить результат проверки документа. Поэтому следует разрешать только внешние схемы из доверенных источников.
Рекомендуется снять флаг ProcessIdentityConstraints (установленный по умолчанию) при проведении проверки ненадежных, больших XML-документов в случаях высокого уровня доступности по схеме с ограничениями удостоверения, наложенными на большую часть документа.
Внешние ресурсы
XML-данные могут содержать ссылки на внешние ресурсы, например файл схемы. По умолчанию внешние ресурсы разрешаются с помощью объекта XmlUrlResolver без пользовательских учетных данных. Это означает, что по умолчанию можно получить доступ к любым расположениям, которые не требуют учетных данных. Это можно сделать еще более безопасным, выполнив одно из следующих действий:
Ограничить ресурсы, к которым имеет доступ XmlReader, установив в качестве значения свойства XmlReaderSettings.XmlResolver объект XmlSecureResolver.
Не разрешать XmlReader открывать какие-либо внешние ресурсы, установив для свойства XmlReaderSettings.XmlResolver значение null.
Совместное использование объектов XmlReaderSettings
Объекты XmlReaderSettings могут содержать конфиденциальные сведения, например учетные данные пользователей. Ненадежный компонент может использовать объект XmlReaderSettings и его учетные данные пользователя, чтобы создавать объекты XmlReader для считывания данных. Следует соблюдать осторожность при кэшировании объектов XmlReaderSettings или при передаче объекта XmlReaderSettings от одного компонента другому.
Вспомогательные компоненты
- Не следует принимать вспомогательные компоненты, например объекты NameTable, XmlNamespaceManager и XmlResolver, из ненадежных источников.
Обработка данных
XML-данные могут содержать большое количество атрибутов, деклараций пространств имен, вложенных элементов и так далее, на обработку которых требуется значительное время.
Можно создать пользовательскую реализацию интерфейса IStream, которая ограничивает размер входных данных, и передать ее классу XmlReader.
Используйте метод ReadValueChunk для обработки больших потоков данных. Этот метод за раз считывает небольшое число символов, а не выделяет одну строку для всего значения.
Класс XmlTextReader
Класс XmlTextReader — это унаследованная реализация класса XmlReader.
Обработка DTD
Обработка определения DTD по умолчанию включена. Чтобы отключить обработку DTD, установите для свойства ProhibitDtd значение true.
Обработка сущностей
По умолчанию общие сущности не раскрываются. Общие сущности раскрываются при вызове метода ResolveEntity.
Внешние ресурсы
XML-данные могут содержать ссылки на внешние ресурсы, например ссылки на определение DTD. По умолчанию внешние ресурсы разрешаются с помощью объекта XmlUrlResolver без пользовательских учетных данных.
Это можно сделать еще более безопасным, выполнив одно из следующих действий.
Ограничить ресурсы, к которым имеет доступ XmlTextReader, установив в качестве значения свойства XmlResolver объект XmlSecureResolver.
Не разрешать XmlTextReader открывать какие-либо внешние ресурсы, установив для свойства XmlResolver значение null.
Класс XslCompiledTransform
Класс XslCompiledTransform — это процессор XSLT, который поддерживает синтаксис XSLT 1.0. Он позволяет преобразовывать XML-данные с помощью таблицы стилей XSLT.
Внешние ресурсы
Таблицы стилей могут содержать ссылки на внешние ресурсы, например элемент xsl:import или xsl:include либо функцию document().
Класс XslCompiledTransform по умолчанию поддерживает элементы xsl:import или xsl:include. Класс XslCompiledTransform по умолчанию отключает поддержку функции document(). Класс XsltSettings используется для включения функции document().
Методы Load и Transform включают в себя перегружаемые, принимающие объект XmlResolver в качестве одного из аргументов. Если XmlResolver не указан, используется XmlUrlResolver по умолчанию без учетных данных.
Управлять способом доступа к внешним ресурсам можно одним из следующих способов.
С помощью объекта XmlSecureResolver ограничить ресурсы, доступ к которым может получать процесс XSLT.
Не разрешать процессу XSLT открывать какие-либо внешние ресурсы путем передачи значения null аргументу XmlResolver.
Блоки сценариев
Класс XslCompiledTransform по умолчанию не поддерживает блоки сценариев. Блоки сценариев включаются с помощью класса XsltSettings. Сценарии XSLT следует включать только при необходимости в поддержке сценариев и при работе в полностью доверенной среде.
Объекты расширения
Объекты расширения добавляют возможности программирования к преобразованиям XSLT. Эта функция включена по умолчанию. Если объекты расширения передаются методу Transform, они используются в преобразовании XSLT.
Модель DOM
Поскольку модель DOM кэширует все данные в памяти, не рекомендуется выполнять такие операции DOM, как запрос, изменение, перемещение вложенных деревьев между документами и сохранение объектов DOM при работе с ненадежными данными во избежание атак типа «отказ в обслуживании». Другим параметром защиты является установка ограничения объема данных, которые могут быть считаны в модель DOM. Одним из способов реализации такого ограничения является создание пользовательского потока, ограничивающего размер входных данных, и его использование для загрузки объекта DOM.
Объекты XmlDocument могут содержать конфиденциальные сведения, например учетные данные пользователей, во внедренном объекте XmlResolver. Если свойство XmlDocument.XmlResolver имеет значение объекта XmlResolver с учетными данными пользователя, не следует кэшировать объект XmlDocument или передавать его ненадежному компоненту. Ненадежный компонент может использовать объект DOM и учетные данные пользователя во внедренном объекте XmlResolver, чтобы получить доступ и загрузить данные.