DTD Prohibited в XML Document C# Exception с DtdProcessing, установленным в DtdProcessing.Parse - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь преобразовать документ XML в другой, используя XslCompiledTransform. Но я получаю исключение со следующим сообщением об ошибке:

По соображениям безопасности DTD запрещено в этом XML документе. Чтобы включить обработку DTD, установите для свойства DtdProcessing в XmlReaderSettings значение Parse и передайте настройки в метод XmlReader.Create.

Я уже установил свойство DtdProcessing в XmlReaderSettings на Parse. Однако я все еще сталкиваюсь с тем же исключением с тем же сообщением об ошибке.

Мой пример кода:

 XslCompiledTransform xslt = new XslCompiledTransform(false);
            XmlReaderSettings xmlReaderSettings = new XmlReaderSettings() { DtdProcessing = DtdProcessing.Parse, ValidationType = ValidationType.DTD };
            xmlReaderSettings.DtdProcessing = DtdProcessing.Parse;
            xmlReaderSettings.ValidationType = ValidationType.DTD;
            xmlReaderSettings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
            using (XmlReader xsltReader = XmlReader.Create(_tesseractSettings.GetXSLTFilePath(), xmlReaderSettings))
            {
                xslt.Load(_tesseractSettings.GetXSLTFilePath());
                xslt.Transform(inputFile, outputFile);
            }

ValidationCallBack:

private static void ValidationCallBack(object sender, ValidationEventArgs e)
    {
        File.WriteAllText(someTxtFilePath, e.Message);
    }

Если это актуально здесь - это объявления типа документа.

Входные XML:

<!DOCTYPE html PUBLIC "/W3C/DTD XHTML 1.0 Transitional/EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

XSLT-файл:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:htm="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0" xpath-default-namespace="http://www.w3.org/1999/xhtml">
    <xsl:output method="xml" omit-xml-declaration="yes"/>

Я также пробовал установить DtdProcessing в DtdProcessing.Ignore и происходит то же исключение. Я также попытался удалить элемент объявления типа документа перед преобразованием. Когда я делаю это, я больше не получаю исключения, однако преобразование не дает мне ожидаемого результата. Я знаю, что проблема не в файле xslt, потому что преобразование все еще работает в Oxygen или любом онлайн-тестере.

Я исследовал inte rnet, но безрезультатно. Любая помощь будет оценена, спасибо.

1 Ответ

0 голосов
/ 04 августа 2020

DTD, что означает Document Type Definition. Целью DTD является определение структуры, юридических элементов и атрибутов документа XML. Однако иногда хакеры используют его для выполнения так называемых атак XXE (XML External Entity) .

Таким образом, Microsoft в основном предоставляет три варианта обработки Dtd, чтобы избежать таких атак:

  • Parse: разрешает анализ содержимого DTD внутри файла xml с помощью программы чтения xml. Однако нам нужно также установить тип проверки и обратный вызов проверки, чтобы сообщать о любых ошибках / предупреждениях.

Inline - это пример из microsoft docs :

using System;
using System.Xml;
using System.Xml.Schema;
using System.IO;

public class Sample {

    public static void Main() {

    // Set the validation settings.
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.DtdProcessing = DtdProcessing.Parse;
    settings.ValidationType = ValidationType.DTD;
    settings.ValidationEventHandler += new ValidationEventHandler (ValidationCallBack);

    // Create the XmlReader object.
    XmlReader reader = XmlReader.Create("itemDTD.xml", settings);

    // Parse the file.
    while (reader.Read());
  }

  // Display any validation errors.
  private static void ValidationCallBack(object sender, ValidationEventArgs e) {
     Console.WriteLine("Validation Error: {0}", e.Message);
  }
}
  • Запрещено: также значение по умолчанию для DtdProcessing. Выдает исключение, когда xml читатель обнаруживает любое содержимое DTD в xml файле.

  • Игнорировать: он просто инструктирует читателя xml игнорировать любое содержимое dtd внутри xml файл и обработать его. В результате на выходе удаляется любой контент dtd, если он присутствует. Это приводит к потере данных.

...