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

注意:该异常发生也可以是其他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)

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);

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

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

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

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

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

XStream xstream=new XStream();//默认是 new XppDriver()
XStream xstream=new XStream(new Xpp3Driver());

猜你喜欢

转载自blog.csdn.net/qq_32331073/article/details/79941132