解决方案(二)— 将 "http://apache.org/xml/features/disallow-doctype-decl" 设置为“true”时, 不允许使用 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());
是的,设置 `reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);` 可以防止 XXE(XML External Entity)攻击。 XXE攻击是一种利用XML解析器的漏洞,通过在XML文档中插入恶意实体引用或外部实体引用,攻击者可以读取敏感文件、执行远程代码等。通过禁用DTD(Document Type Definition)处理,可以有效地防止XXE攻击。 在Java中,使用 `javax.xml.parsers.DocumentBuilderFactory` 来创建XML解析器,然后使用 `javax.xml.parsers.DocumentBuilder` 来解析XML文档。要防止XXE攻击,可以在创建 `DocumentBuilderFactory` 对象后设置相应的特性。 以下是一个示例代码片段,展示了如何设置防止XXE攻击的特性: ```java import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; public class Main { public static void main(String[] args) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); DocumentBuilder builder = factory.newDocumentBuilder(); // 继续处理你的XML文档... } catch (Exception e) { e.printStackTrace(); } } } ``` 通过设置上述特性,XML解析器将拒绝处理DTD声明,从而有效地防止了XXE攻击。 请注意,在实际开发中,除了禁用DTD处理,还应该采取其他安全措施,如输入验证、使用白名单过滤等,以确保应用程序的安全性。 希望这可以回答你的问题。如果还有其他疑问,请随提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值