XML文档C#中禁止的DTD DtdProcessing设置为DtdProcessing.Parse的异常



我正在尝试使用XslCompiledTransform将一个XML文档转换为另一个。但我得到了一个异常,错误消息如下:

出于安全原因,此XML文档中禁止使用DTD。若要启用DTD处理,请将XmlReaderSettings上的DtdProcessing属性设置为Parse,并将设置传递到XmlReader.Create方法中。

我已经将XmlReaderSettings上的DtdProcessing属性设置为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);
}

验证回调:

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,会出现同样的异常。我还尝试在转换之前删除DocumentType声明元素。当我这样做时,我不再得到异常,但是转换并没有给我预期的输出。我知道问题不在于xslt文件,因为转换仍然适用于Oxygen或任何在线测试人员。

我一直在研究互联网,但没有结果
如有任何帮助,我们将不胜感激。谢谢。

DTD代表Document Type Definition。DTD的目的是定义XML文档的结构以及法律元素和属性。然而,它偶尔会被黑客利用来执行XXE(XML外部实体(攻击。

因此,微软基本上为Dtd处理提供了三种选项来避免此类攻击:

  • 解析:允许xml读取器解析xml文件内部的DTD内容。但是,我们还需要设置验证类型和验证回调,以报告任何错误/警告

Inline是微软文档中的一个例子:

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读取器遇到xml文件中的任何DTD内容时抛出异常。

  • Ignore:它只是指示xml读取器忽略xml文件中的任何dtd内容并对其进行处理。因此,如果存在任何dtd属性,则输出将被剥离。从而导致数据丢失。

最新更新