我将CXF(JAX RS)用于其余服务,并将默认JAXBElementProvider用于xml请求/响应封送/拆组。 一切正常..但是现在我想防止XML请求中的XXE攻击,默认情况下JAXBElementProvider不起作用。如何在下面的声明中配置xxe防护参数?
<bean id="jaxbProvider" class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
<jaxrs:server id="myendpoint" address="/">
<jaxrs:providers>
<ref bean="jaxbProvider"/>
<ref bean="jsonProvider"/>
</jaxrs:providers>
<jaxrs:extensionMappings>
<entry key="json" value="application/json"/>
<entry key="xml" value="application/xml"/>
</jaxrs:extensionMappings>
</jaxrs:server>
答案 0 :(得分:1)
根据CXF安全通报CVE-2010-2076,应在CXF默认配置中缓解XXE攻击。这是假设您正在使用最新(或相对较新)的CXF版本,并且没有按XML security section of CXF doc中所述设置org.apache.cxf.stax.allowInsecureParser
系统属性。 Woodstox解析器库必须在您的类路径中,才能由CXF用作默认XMLInputFactory。
您还可以使用自定义XMLInputFactory来满足您的需求(例如,出于安全性考虑禁用其他解析功能),但是在大多数情况下都不需要这样做。例如,
<jaxrs:server id="myendpoint" address="/">
<jaxrs:properties>
<entry key="javax.xml.stream.XMLInputFactory">
<bean class="your.own.ParserFactory" factory-method="createFactory"/>
</entry>
</jaxrs:properties>
</jaxrs:server>
然后以您自己的your.own.ParserFactory#createFactory()
开头:
XMLInputFactory factory = XMLInputFactory.newInstance();
并在Woodstox XMLInputFactory支持的属性中设置工厂所需的属性。