При использовании XmlDocument.Load я нахожу, что если документ ссылается на DTD, соединение выполняется с предоставленным URI. Есть ли способ предотвратить это?
Запретить загрузку DTD при анализе XML
Ответ 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, установленное по умолчанию по умолчанию.