Подтвердить что ты не робот

Запретить загрузку DTD при анализе XML

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

4b9b3361

Ответ 1

После некоторого дополнительного копания, возможно, вы должны установить свойство 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);
            }

Ответ 2

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

С

settings.ProhibitDtd = true;

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

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

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

Похоже, что ValidationType выполнит трюк, но с помощью:

settings.ValidationType = ValidationType.None;

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

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