Предотвращение загрузки DTD при разборе XML

При использовании XmlDocument.Load я обнаружил, что если документ ссылается на DTD, выполняется соединение с предоставленным URI. Есть ли способ предотвратить это?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
33
0
31 124
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Используйте XMLReader для загрузки документа и установите для свойства ValidationType в настройках устройства чтения значение None.

Это не поможет вам, если XML использует ссылки на сущности, определенные в DTD, к сожалению, потому что это делает XML некорректным, не недействительным.

Robert Rossney 19.10.2008 09:59

Итак, у меня осталось ощущение, что необходимо обработать DTD, чтобы правильно обрабатывать ссылки на сущности. Но как это будет работать при отсутствии соединения?

spender 19.10.2008 16:00

Это не так. Если ваш документ может содержать ссылки на сущности, которые определены в DTD, синтаксическому анализатору потребуется DTD. Поэтому вам нужно либо включить DTD в XML, который вы пытаетесь проанализировать, либо кэшировать DTD локально. Это одна из причин, по которой мне не нравится использовать ссылки на сущности.

Robert Rossney 20.10.2008 00:05

Попробуйте что-то вроде этого:

XmlDocument doc = new XmlDocument();
using (StringReader sr = new StringReader(xml))
  using (XmlReader reader = XmlReader.Create(sr, new XmlReaderSettings()))
  {
     doc.Load(reader);
  }

Здесь следует отметить, что в XmlReaderSettings для свойства ProhibitDtd по умолчанию установлено значение true.

Загружаемый документ ИМЕЕТ ОТД.

С:

settings.ProhibitDtd = true;

Я вижу следующее исключение:

Service cannot be started. System.Xml.XmlException: For security reasons DTD is prohibited in this XML document. To enable DTD processing set the ProhibitDtd property on XmlReaderSettings to false and pass the settings into XmlReader.Create method.

Таким образом, похоже, что в этом случае для параметра ProhibitDtd ДОЛЖНО быть установлено значение true.

Похоже, ValidationType сработает, но с:

settings.ValidationType = ValidationType.None;

Я все еще вижу связь с URI DTD.

Ответ принят как подходящий

После некоторого рытья, возможно, вам следует установить для свойства XmlResolver объекта XmlReaderSettings значение null.

'The XmlResolver is used to locate and open an XML instance document, or to locate and open any external resources referenced by the XML instance document. This can include entities, DTD, or schemas.'

Итак, код будет выглядеть так:

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.XmlResolver = null;
        settings.DtdProcessing = DtdProcessing.Parse;
        XmlDocument doc = new XmlDocument();
        using (StringReader sr = new StringReader(xml))
            using (XmlReader reader = XmlReader.Create(sr, settings))
            {
                doc.Load(reader);
            }

также требуется: settings.ProhibitDtd = false; в остальном прямо на деньгах. ваше здоровье!

spender 20.10.2008 02:43

Это полезный прием, но имейте в виду, что он не сработает для всех XML-документов. Если документ действительно каким-то образом ссылается на DTD (например, на ссылку на сущность), вы получите исключение XML, когда попытаетесь прочитать документ.

Peter Ruderman 06.12.2010 20:16

Я попробовал это и также обнаружил, что это работает, однако меня немного обеспокоил этот комментарий в документации MSDN: «Если установлено значение null, возникает исключение XmlException, когда XmlReader пытается получить доступ к внешнему ресурсу». Этого явно не происходит, но кто-нибудь знает почему? Кто-нибудь хочет это прокомментировать?

Steg 22.12.2010 13:44

После некоторых экспериментов я обнаружил, что установка Обработки на Разбор все еще не позволяет получить DTD. Это помогло мне перестать казаться глупым: XmlReaderSettings settings = new XmlReaderSettings {DtdProcessing = DtdProcessing.Ignore};

hoserdude 30.07.2013 00:04

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

Проблема с DTD особенно серьезна, потому что DTD могут включать общие объявления сущностей (для таких вещей, как & -> &), на которые фактически может полагаться XML-файл. Так что, если ваш синтаксический анализатор предпочитает отказаться от загрузки DTD, а XML использует общие ссылки на сущности, синтаксический анализ может действительно потерпеть неудачу.

Единственным решением этой проблемы был бы прозрачный кэширующий преобразователь сущностей, который помещал бы загруженные файлы в некоторый архив в пути поиска библиотеки, так что этот архив будет динамически создаваться и почти автоматически объединяться с любыми созданными дистрибутивами программного обеспечения. Но даже в мире Java нет ни одного достойного такого EntityResolver, который бы не был встроен ни в что, начиная с Apache Foundation.

Другие вопросы по теме