当使用带弹簧批的XStreamMarshaller时,我收到以下消息:
Security framework of XStream not initialized, XStream is probably vulnerable.
首先尝试:根据文档,我尝试重置所有权限,但我仍然有相同的消息。此外,在解析XML文件时我没有安全性错误...所以我认为这段代码不起作用。这是代码示例:
XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.getXStream().addPermission(NoTypePermission.NONE);
第二次尝试:我也尝试使用setSupportedClasses
方法,但它也没有工作(我仍然收到漏洞消息,并且不支持的类仍然无法正确排除):
XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.setSupportedClasses(FooBar.class);
如何使用XStreamMarshaller设置安全权限?
注意:根据this thread,安全框架是在1.4.7中引入的,它仍然不是强制性的......但它对XStream 1.5.0是强制性的!
使用的XStream版本:1.4.10
使用的Spring Batch版本:4.0.1
有关信息,我使用的是Spring Boot(但我不确定它与此相关)
答案 0 :(得分:4)
首次尝试'
的解决方案它不起作用的原因是XStreamMarshaller用afterPropertiesSet
实例化一个xstream对象而不检查是否已经创建了一个,所以我们不能在{1}中使用getXStream()
@Bean方法。为了使这个工作,我们可以例如在另一个bean中注入marshaller时设置安全配置:
@Configuration
public class JobSecurityConfig {
public JobSecurityConfig(XStreamMarshaller marshaller) {
XStream xstream = marshaller.getXStream();
XStream.setupDefaultSecurity(xstream);
xstream.allowTypes(new Class[]{Bar.class});
}
}
另一个解决方案:扩展XSreamMarshaller
您还可以扩展XStreamMarshaller
并仅覆盖customizeXStream()
方法以设置安全配置。
@Override
protected void customizeXStream(XStream xstream) {
XStream.setupDefaultSecurity(xstream);
xstream.allowTypes(new Class[]{Bar.class});
}
为什么第二次尝试'不起作用:
setSupportedClasses
仅用于编组!! .. StaxEventItemReader
并不关心支持的课程!
答案 1 :(得分:1)
Xstream网站提供了有关安全框架Security Framework的详细信息。
以下方法用于设置安全权限
XStream.addPermission(TypePermission);
XStream.allowTypes(Class[]);
XStream.allowTypes(String[]);
XStream.allowTypesByRegExp(String[]);
XStream.allowTypesByRegExp(Pattern[]);
XStream.allowTypesByWildcard(String[]);
XStream.allowTypeHierary(Class);
XStream.denyPermission(TypePermission);
XStream.denyTypes(Class[]);
XStream.denyTypes(String[]);
XStream.denyTypesByRegExp(String[]);
XStream.denyTypesByRegExp(Pattern[]);
XStream.denyTypesByWildcard(String[]);
XStream.denyTypeHierary(Class);
您也可以参考此Tutorial
我希望这会有所帮助
答案 2 :(得分:1)
默认情况下,XStream允许对任意类进行解组, 这可能导致不安全的Java序列化效果。因此,它是 不建议使用XStreamMarshaller来解组XML 外部源(即Web),因为这可以带来安全性 漏洞。
您正在使用Spring的抽象XStreamMarshaller
与XStream
库进行交互。默认情况下,库可以编组/解组任意类(包括来自外部Web源)。
如果您不这样做(使用来自外部网络源的类),您可以忽略该消息。
如果您要删除该消息,请按照Spring的官方文档(上面链接的)和XStream网站(security config example)中的建议进行删除。
归结为setting up supported classes以确保只有已注册的课程才有资格进行解组。
默认情况下,此属性为空,这意味着 - 支持所有类 - 因此您将收到警告消息。