当使用带有弹簧批次的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 设置安全权限?
注意:根据此线程,安全框架是在 1.4.7 中引入的,它仍然不是强制性的......但它对于XStream 1.5.0将是强制性的!
使用的XStream版本:1.4.10
使用的弹簧批处理版本:4.0.1
有关信息,我正在使用 Spring Boot(但我不确定它是否与这里相关)
"第一次尝试"的解决方案:
它不起作用的原因是XStreamMarshaller使用afterPropertiesSet
实例化xstream对象,而不检查是否已创建一个对象,因此我们不能在@Bean方法中使用getXStream()
。为了完成这项工作,我们可以在另一个 bean 中注入编组器时设置安全配置:
@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
不关心支持的类!
Xstream网站提供了有关安全框架安全框架的详细信息。
提供以下方法来设置安全权限
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);
您也可以参考本教程
我希望这有帮助
来自官方的春季文档:
默认情况下,XStream 允许对任意类进行解组, 这可能会导致不安全的 Java 序列化效果。因此,它是 不建议使用 XStreamMarshaller 从 外部来源(即网络),因为这可能会导致安全性 漏洞。
您正在使用 Spring 的抽象XStreamMarshaller
与XStream
库进行交互。默认情况下,库可以编组/取消编组任意类(包括来自外部 Web 源)。
如果您不这样做(使用来自外部 Web 源的类),您可以简单地忽略该消息。
如果您想删除该消息,请按照 Spring 的官方文档(上面链接)和 XStream 网站(安全配置示例)中的建议进行操作。
它归结为设置支持的类,以确保只有注册的类才有资格进行解组。
默认情况下,此属性为空,这意味着 - 支持所有类 - 因此您会收到警告消息。