当前位置: 首页 > 知识库问答 >
问题:

变压器工厂对 XML EER 的不当限制

干稳
2023-03-14

获取Veracode漏洞“对”变压器工厂“的XML外部实体引用限制不当,对此有几种解决方案,我发现最相关的是:解决方案。但是在尝试了这些解决方案之后,它们都没有奏效。下面是代码:

import net.sf.saxon.TransformerFactoryImpl;
.....
 TransformerFactory genericFactory = TransformerFactoryImpl.newInstance();
 genericFactory.setFeature("http://javax.xml.XMLConstants/property/accessExternalDTD", false);  
 genericFactory.setFeature(Constants.FEATURE_SECURE_PROCESSING,true);

错误是:

javax.xml.transform.TransformerConfigurationException: Unsupported TransformerFactory feature: http://javax.xml.XMLConstants/property/accessExternalDTD

目前我在Java8上运行应用程序,相关jar有:saxon9. jar,xalan-2.7.2.jar

我尝试了几种组合,比如:

//1
 TransformerFactory genericFactory = javax.xml.transform.TransformerFactory.newInstance();
 genericFactory.setFeature("http://javax.xml.XMLConstants/property/accessExternalDTD", false);  
//2
 TransformerFactory genericFactory = com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newInstance();
 genericFactory.setFeature("http://javax.xml.XMLConstants/property/accessExternalDTD", false);

但是得到同样的错误。如何解决此错误?

共有1个答案

佴波鸿
2023-03-14

根据OWASP在描述如何防止XML外部实体注入(XXE)时的说法,当使用Java和TransformerFactory时,推荐的方法如下:

TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");

请注意,它们配置的是属性,而不是功能。

请考虑查看为< code>TransformerFactory中的< code>setAttribute方法提供的文档,我认为它会有所帮助:

对源文件中的外部 DTD 的访问仅限于 XMLConstants.ACCESS_EXTERNAL_DTD 属性指定的协议。如果在转换期间由于此属性的限制而拒绝访问,则 Transformer.transform(Source, Result) 将引发 TransformerException

对样式表中外部 DTD 的访问仅限于 XMLConstants.ACCESS_EXTERNAL_DTD 属性指定的协议。如果在创建新转换器期间由于此属性的限制而拒绝访问,则 newTransformer(Source) 方法将引发 TransformerConfigurationException

通过样式表处理指令对外部引用集的访问,导入和包含元素被限制为XMLConant.ACCESS_EXTERNAL_STYLESHEET属性指定的协议。如果在创建新转换器期间由于该属性的限制而拒绝访问,TransformerConfigurationException将由newTransform(Source)方法抛出。

 类似资料:
  • 我正在研究Joshua Bloch的Effective Java,他在书中解释了实现不可变类的不同方法。为了防止子类化,一种方法是使用 final。更复杂的方法是使构造函数私有,从而防止外部访问,并使用静态工厂创建对象。 但是,我不明白这个说法: 它最灵活,因为它允许使用多个包私有实现类。 我知道在没有公共/受保护的构造函数的情况下,外部客户端不可能对其进行子类化,但不了解术语“多包私有实现类”所

  • 我有下面的XML文件,我想以特定的方式对它进行排序。基本上,XMLtag将首先按字母排序,然后在每个XMLtag中,使用一个XMLelement也按字母排序。请看当前的XML和我是必需的最终结果 原始XML 最终输出 一旦标记被排序,那么对于这些标记中的每一个,我将使用特定的元素对它们进行排序。示例:将使用application xmlelement值按字母顺序对ApplicaitOnVisial

  • 已经阅读了如何通过以下步骤使类不可变 null 我不确定我是否清楚地理解了私有构造函数和工厂方法在不变性上下文中的效用。如果我使class final,基本上就是关闭扩展它的任何其他类的所有路径。这是一种更复杂的方法吗 我见过单例模式中的私有构造函数、工厂方法,这很有意义。但是当我们谈到对象的不可变性时,当我们提到私有构造函数和静态工厂方法时,我们是否也在限制对象构造/实例化??

  • 我的问题与之前的后优化哈希集初始化(Scala | Java)非常相似,我想使用哈希集来加速(目前我正在使用哈希集),但哈希集没有显示其(恒定时间)优势。 对于提到的解决方案: 你可以通过实习来减少同等费用。这意味着您通过工厂方法获取类的新对象,工厂方法检查请求的新对象是否已经存在,如果已经存在,则返回对现有对象的引用。如果您断言这种类型的每个对象都是以这种方式构造的,那么您就知道每个不同对象只有

  • 问题内容: 因此,我习惯于在Angular中使用工厂和服务。 我正在阅读Angular2文档,但看不到任何等效的工厂。Angular2的等效项是什么? 问题答案: 工厂,服务,常量和值都在Angular2中消失了。Angular2与经典Angular有根本性和根本性的不同。在Angular2中,核心概念是 组件 依赖注入 捆绑 服务,工厂,提供者和常量的概念在Angular 1中受到了批评。很难在

  • 问题内容: 我有一个变量,将由一个或多个控制器使用,由服务更改。在那种情况下,我建立了一个服务来将该变量保存在内存中,并在控制器之间共享。 问题是:每次变量更改时,控制器中的变量都不会实时更新。 我创建这个小提琴来提供帮助。http://jsfiddle.net/ncyVK/ -–请注意,当我增加count的值时,或永远不会更新。 如何将Service / Factory变量绑定到Controll

  • 原始关闭原因未解决 我在下面的链接中有一个带有转换器的xml输入文件。https://xsltfiddle.liberty-development.net/gVAkJ5g/2 transformer是通过另一个开发人员创建的,但现在数据没有显示在输出中。 知道为什么吗??我一直在想这个问题,但运气不好。 例如:$root值未显示在ASSORTMENT_ID或DESCRIPTION标签中 干杯

  • 当更改中的时,发现中的也会更改,例如是单例? 我的假设是,一个新的实例被注入到带有工厂的控制器中?