当前位置:  开发笔记 > 编程语言 > 正文

解析XML时防止DTD下载

如何解决《解析XML时防止DTD下载》经验,为你挑选了3个好方法。

使用XmlDocument.Load时,我发现如果文档引用DTD,则会与提供的URI建立连接.有没有办法防止这种情况发生?



1> Richard Nien..:

经过一些挖掘,可能应该将XmlReaderSettings对象的XmlResolver属性设置为null.

'XmlResolver用于查找和打开XML实例文档,或用于查找和打开XML实例文档引用的任何外部资源.这可以包括实体,DTD或模式.

所以代码看起来像这样:

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.XmlResolver = null;
        settings.DtdProcessing = DtdProcessing.Parse;
        XmlDocument doc = new XmlDocument();
        using (StringReader sr = new StringReader(xml))
            using (XmlReader reader = XmlReader.Create(sr, settings))
            {
                doc.Load(reader);
            }


还需要的是:settings.ProhibitDtd = false; 否则,对钱.干杯!
这是一个有用的技巧,但请记住,它不适用于所有XML文档.如果文档实际上以某种方式引用了DTD(例如实体引用),那么当您尝试读取文档时,您将获得XML异常.
经过一些实验,我发现设置Processing to Parse仍然可以获得DTD.这样就完成了这个伎俩并阻止它对我来说很愚蠢:XmlReaderSettings settings = new XmlReaderSettings {DtdProcessing = DtdProcessing.Ignore};
我试过这个并发现它有效,但我对MSDN文档中的这个注释感到有些困惑:"如果设置为null,当XmlReader尝试访问外部资源时会抛出XmlException".这显然没有发生,但有人知道为什么吗?有人关心对此发表评论吗?

2> spender..:

正在加载的文档具有DTD.

附:

settings.ProhibitDtd = true;

我看到以下异常:

服务无法启动.System.Xml.XmlException:出于安全原因,此XML文档中禁止使用DTD.要启用DTD处理,请将XmlReaderSettings上的ProhibitDtd属性设置为false,并将设置传递给XmlReader.Create方法.

因此,在这种情况下看起来像ProhibitDtd必须设置为true.

看起来ValidationType可以解决问题,但是:

settings.ValidationType = ValidationType.None;

我仍然看到与DTD uri的连接.



3> 小智..:

这实际上是XML规范中的一个缺陷.W3C正在哀叹所有人都疯狂地点击他们的服务器来加载模式数十亿次.不幸的是,几乎没有标准的XML库能够做到这一点,它们都会一次又一次地击中服务器.

DTD的问题特别严重,因为DTD可能包含&XML文件实际可能依赖的通用实体声明(例如- >&).因此,如果您的解析器选择放弃加载DTD,并且XML使用通用实体引用,则解析可能实际上失败.

此问题的唯一解决方案是透明缓存实体解析器,它将下载的文件放入库搜索路径中的某个存档中,以便该存档可以动态创建并几乎自动与任何软件分发捆绑在一起.但即使在Java世界中,也没有一个像这样的EntityResolver漂浮,当然也不是内置于apache基础的任何东西.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有