Sonar检测SchemaFactory需禁用XML解析外部实体:该如何修复?
SchemaFactory Sonar检测问题排查与修复
问题分析
你按照Sonar给出的方案选择禁用DOCTYPE声明,但仍被检测出安全问题,核心原因可能是解析器特性支持差异、Sonar规则误判,或是newInstance参数未确保安全解析器加载。
修复方案
1. 强化安全特性配置(无需外部属性)
不同XML解析器对单一特性的支持可能不彻底,需补充禁用外部实体的特性,确保完全阻断风险:
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); // 禁用DOCTYPE声明 factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // 禁用外部实体解析,覆盖更多解析器场景 factory.setFeature("http://xml.org/sax/features/external-general-entities", false); factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
2. 显式指定安全解析器实现
指定具体的安全解析器类,避免newInstance加载默认的不安全实现:
SchemaFactory factory = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI, "com.sun.org.apache.xerces.internal.jaxp.SchemaFactoryImpl", Thread.currentThread().getContextClassLoader() ); factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
3. 排查Sonar规则误判
若上述配置后仍被检测,大概率是Sonar规则未适配当前解析器的配置逻辑:
- 可在Sonar中对该代码块添加规则排除;
- 收集配置信息提交Issue给Sonar官方,确认是否为规则Bug。
4. 使用预封装的安全库(无需手动配置)
借助OWASP ESAPI等安全库,直接获取预配置的SchemaFactory:
SchemaFactory safeFactory = ESAPI.xmlValidator().getSchemaFactory();
内容的提问来源于stack exchange,提问作者makozaki
相关产品推荐
相关产品推荐

