赞
踩
注意:该异常发生也可以是其他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());
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。