Запретить загрузку DTD при разборе XML - PullRequest
31 голосов
/ 19 октября 2008

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

Ответы [ 5 ]

32 голосов
/ 19 октября 2008

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

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

Таким образом, код будет выглядеть так:

        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);
            }
6 голосов
/ 19 октября 2008

Загружаемый документ имеет DTD.

С:

settings.ProhibitDtd = true;

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

Служба не может быть запущена. System.Xml.XmlException: по соображениям безопасности DTD запрещен в этом документе XML. Чтобы включить обработку DTD, установите для свойства ProhibitDtd в XmlReaderSettings значение false и передайте настройки в метод XmlReader.Create.

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

Похоже, что ValidationType добьется цели, но с:

settings.ValidationType = ValidationType.None;

Я все еще вижу соединение с DTD uri.

5 голосов
/ 19 февраля 2011

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

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

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

3 голосов
/ 19 октября 2008

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

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

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

1 голос
/ 19 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...