You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用独立DTD文件验证XML时抛出安全异常问题

独立DTD文件验证XML时的安全异常解决办法

尝试用独立DTD文件验证XML文件时,仅当DTD定义在XML的DOCTYPE元素中时验证正常。将DTD拆分到独立.dtd文件后,执行settings.Schemas.Add(null, dtdPath);会抛出如下安全异常:

For security reasons DTD is prohibited in this XML document. To enable DTD processing set the DtdProcessing property on XmlReaderSettings to Parse and pass the settings into XmlReader.Create method.

现有代码

var settings = new XmlReaderSettings {
    ValidationType = ValidationType.DTD,
    DtdProcessing = DtdProcessing.Parse,
    ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings
};

string basePath = AppDomain.CurrentDomain.BaseDirectory;
string xmlPath = Path.Combine(basePath, "data", "sample.xml");
string dtdPath = Path.Combine(basePath, "data", "sample.dtd");

// 拆分DTD后添加的代码,抛出异常的位置
settings.Schemas.Add(null, dtdPath);

using (XmlReader reader = XmlReader.Create(xmlPath, settings))
{
    XmlDocument xmlDoc = new XmlDocument();     
    xmlDoc.Load(reader);
}

独立DTD文件内容(sample.dtd)

<!ELEMENT store (item)*>
<!ELEMENT item (name,price,dept1)>
<!ATTLIST item type CDATA #REQUIRED>
<!ATTLIST item ISBN CDATA #IMPLIED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT dept1 (#PCDATA)>

未引用DTD的XML文件内容(sample.xml)

<store>
    <item type="supplies"  ISBN="2-3631-4">
        <name>paint</name>
        <price>16.95</price>
        <dept1>Hello</dept1>
    </item>
</store>

问题原因

XmlReaderSettings.Schemas属性是用于管理XML Schema (XSD) 架构的,并非DTD。将DTD文件添加到Schemas集合中会触发安全限制,导致抛出异常——即使已经设置了DtdProcessing = DtdProcessing.Parse。

解决办法

方案一:XML文件中添加DOCTYPE引用外部DTD

修改XML文件,通过DOCTYPE声明指定外部DTD的位置,这是XML引用外部DTD的标准方式:

<!DOCTYPE store SYSTEM "sample.dtd">
<store>
    <item type="supplies"  ISBN="2-3631-4">
        <name>paint</name>
        <price>16.95</price>
        <dept1>Hello</dept1>
    </item>
</store>

然后删除代码中的settings.Schemas.Add(null, dtdPath);行,保持其他配置不变,直接运行代码即可完成验证。

方案二:手动指定DTD解析(无需修改XML)

如果无法修改XML文件,可以通过XmlResolver指定DTD的加载路径:

var settings = new XmlReaderSettings {
    ValidationType = ValidationType.DTD,
    DtdProcessing = DtdProcessing.Parse,
    ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings,
    // 允许解析外部DTD资源
    XmlResolver = new XmlUrlResolver { Credentials = CredentialCache.DefaultCredentials }
};

string basePath = AppDomain.CurrentDomain.BaseDirectory;
string xmlPath = Path.Combine(basePath, "data", "sample.xml");

// 创建读取上下文,手动关联DTD
var doc = new XmlDocument();
doc.XmlResolver = settings.XmlResolver;

using (var fs = File.OpenRead(xmlPath))
{
    // 加载XML并验证
    doc.Load(fs);
    doc.Validate((sender, e) => {
        // 处理验证警告或错误
        if (e.Severity == XmlSeverityType.Warning)
            Console.WriteLine($"警告: {e.Message}");
        else
            Console.WriteLine($"错误: {e.Message}");
    });
}

内容的提问来源于stack exchange,提问作者andris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 01:54:54