Исключение «DTD запрещено» при преобразовании файла XML - PullRequest
0 голосов
/ 25 марта 2020

Я создал пользовательский HTMLHelper, который должен обрабатывать XML. Метод принимает XML и путь к файлу XSL и должен возвращать HTML.

. При доступе к странице я получаю сообщение об ошибке

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

Как вы можете видеть в моем коде ниже, я устанавливаю DtdProcessing в Parse в XmlReaderSettings (как предполагает исключение), который, как я думал, решит проблему. При ближайшем рассмотрении происходит исключение в строке:

transformObj.Load(xsltPath);

Но я не вижу, как передать этому методу XmlReaderSettings, чтобы установить свойство DtdProcessing. Единственные перегрузки XslCompiledTransform.Load, которые принимают объект настроек, ожидают объект XsltSettings, у которого нет свойства DtdProcessing.

Полный метод выглядит следующим образом:

public static IHtmlContent RenderXml(this IHtmlHelper htmlHelper, string xml, string xsltPath)
{
    XsltArgumentList args = new XsltArgumentList();
    // Create XslCompiledTransform object to load and compile XSLT file.  
    XslCompiledTransform transformObj = new XslCompiledTransform();
    transformObj.Load(xsltPath);

    // Create XMLReaderSetting object to assign DtdProcessing, Validation type  
    XmlReaderSettings xmlSettings = new XmlReaderSettings();
    xmlSettings.DtdProcessing = DtdProcessing.Parse;
    xmlSettings.MaxCharactersFromEntities = 1024; // Prevent DoS attacks
    xmlSettings.ValidationType = ValidationType.DTD;

    // Create XMLReader object to Transform xml value with XSLT setting
    XmlReader reader = XmlReader.Create(new StringReader(xml), xmlSettings);

    using (reader)
    {
        StringWriter writer = new StringWriter();
        transformObj.Transform(reader, args, writer);

        // Generate HTML string from StringWriter  
        HtmlString htmlString = new HtmlString(writer.ToString());
        return htmlString;
    }
}

И, на мой взгляд, я использую:

@Html.RenderXml(ViewBag.XML as string, ViewBag.XSL as string);

Я рассмотрел совет в ответах на на этот вопрос , но, насколько я могу судить, я уже принял предложенные шаги. Принятый ответ на этот вопрос MSDN , кажется, намекает на ответ, но я не смог понять, как его использовать.

1 Ответ

1 голос
/ 25 марта 2020

Если XSLT использует или ссылается на DTD, передайте XmlReader с необходимыми XmlReaderSettings методу Load, т. Е. Используйте перегрузку https://docs.microsoft.com/en-us/dotnet/api/system.xml.xsl.xslcompiledtransform.load?view=netframework-4.8#System_Xml_Xsl_XslCompiledTransform_Load_System_Xml_XmlReader_ с

using (XmlReader xsltReader = XmlReader.Create(xsltPath, new XmlReaderSettings() { DtdProcessing = DtdProcessing.Parse }))
{
  transformObj.Load(xsltReader);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...