Игнорирует ли LINQ to XML включения из DTD?

Я использую MathML DTD для разбора MathML с использованием System.Xml.Linq. В то время как обычный материал MathML распознается нормально, включение MMLEXTRA в DTD игнорируется, и я получаю ошибки. Вот код, который я использую:

  if (!string.IsNullOrWhiteSpace(mathML))
  {
    try
    {
      const string preamble =
          "<!DOCTYPE mml:math PUBLIC \"-//W3C//DTD MathML 2.0//EN\"\n" +
           "\"http://www.w3.org/Math/DTD/mathml2/mathml2.dtd\" [\n" +
           "<!ENTITY % MATHML.prefixed \"INCLUDE\">\n" +
           "<!ENTITY % MATHML.prefix \"mml\"> \n" +
         "]>";
      var parsed = Parser.Parse(preamble + Environment.NewLine + mathML);
      textEditor.Text = printed;
      lblStatus.Caption = "MathML successfully translated.";
    } 
    catch (Exception e)
    {
      lblStatus.Caption = "Cannot translate text. " + e.Message;
    }
  }

Парсер просто выполняет XDocument.Load(). Любая помощь приветствуется!


person Dmitri Nesteruk    schedule 22.03.2011    source источник
comment
@Kirk Parser - это просто компонент, который в основном выполняет XDocument.Load. Предполагается, что этот вызов будет напрямую разрешать все ссылки MathML, но это не так.   -  person Dmitri Nesteruk    schedule 22.08.2011


Ответы (1)


Из здесь

Сущности в DTD по своей сути небезопасны. Вредоносный XML-документ, содержащий DTD, может привести к тому, что синтаксический анализатор использует всю память и процессорное время, вызывая атаку типа «отказ в обслуживании». Поэтому в LINQ to XML обработка DTD по умолчанию отключена. Вы не должны принимать DTD из ненадежных источников.

Однако, чтобы включить его, вы должны использовать класс XDocumentType. .

Пара возможных решений:

XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;

XmlReader reader = XmlReader.Create(Server.MapPath("filename"), settings);

XDocument doc = XDocument.Load(reader);

Или, может быть:

 XDocument xDocument = new XDocument(new XDocumentType("Books",null,"Books.dtd", null),new XElement("Book"));

Вся информация взята из того же источника.

person Richard    schedule 22.08.2011
comment
Потрясающий! Это полностью делает это для меня. Фу! Потрачено 50 очков репутации, но мой товар в безопасности :) Спасибо! - person Dmitri Nesteruk; 23.08.2011
comment
Цитируемый ответ противоречит текущей документации MS, в которой говорится: «Когда документ содержит ссылки на объекты, определенные в DTD, ссылки расширяются при создании дерева XML»: docs.microsoft.com/en-us/dotnet/api/ Может быть, где-то за эти 9 лет было принято решение об изменении конструкции. - person interDist; 09.06.2020