当前位置:   article > 正文

解决方案(二)— 将 "http://apache.org/xml/features/disallow-doctype-decl" 设置为“true”时, 不允许使用 DOCTYPE

disallow-doctype-decl

注意:该异常发生也可以是其他XML解析器,这里以XStream为例。


使用XStream解析xml文件的时候抛出异常:


: org.xml.sax.SAXParseException;将功能 “http://apache.org/xml/features/disallow-doctype-decl” 设置为“真”时, 不允许使用 DOCTYPE。

Caused by: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 10; 将功能 "http://apache.org/xml/features/disallow-doctype-decl" 设置为“真”时, 不允许使用 DOCTYPE。
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
	at com.thoughtworks.xstream.io.xml.DomDriver.createReader(DomDriver.java:108)
  • 1
  • 2
  • 3
  • 4

"http://apache.org/xml/features/disallow-doctype-decl"设为true

目的是为了禁用xml中的inline DOCTYPE 声明,说白了就是禁用DTD,不允许将外部实体包含在传入的 XML 文档中,从而防止XML实体注入(XML External Entities 攻击,利用能够在处理时动态构建文档的 XML 功能,注入外部实体)。

为了避免XXE injections,应为XML代理、解析器或读取器设置下面的属性:

factory.setFeature("http://xml.org/sax/features/external-general-entities",false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities",false);
  • 1
  • 2

如果根本不需要 inline DOCTYPE 声明,可直接使用以下属性将其完全禁用

factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
  • 1

你可能使用的是下面这种方式创建XStream实例,而DomDriver默认禁用了DTD,或者是别的什么xxxDriver,如果出现了该异常,都是默认禁用了DTD,例如:

XStream xstream=new XStream(new DomDriver());//DomDriver默认不支持DTD
  • 1

你可以使用XppDriver,Xpp3Driver,XppDomDriver等等,默认支持DTD的驱动器来构造实力。

XStream xstream=new XStream();//默认是 new XppDriver()
XStream xstream=new XStream(new Xpp3Driver());
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/612757
推荐阅读
相关标签
  

闽ICP备14008679号