8

将 XStreamMarshaller 与 spring 批处理一起使用时,我收到以下消息:

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

使用的 Spring Batch 版本:4.0.1

有关信息,我正在使用 Spring Boot(但我不确定它是否与此处相关)

4

3 回答 3

6

“第一次尝试”的解决方案:

它不起作用的原因是 XStreamMarshaller 实例化了一个 xstream 对象而afterPropertiesSet没有检查是否已经创建,所以我们不能getXStream()在 @Bean 方法中使用。为了使这项工作,我们可以例如在将编组器注入另一个 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不关心支持的类!

于 2018-04-03T10:19:26.473 回答
1

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);

您也可以参考本教程

我希望这有帮助

于 2018-03-28T10:38:21.323 回答
1

来自官方春季文档

默认情况下,XStream 允许解组任意类,这会导致不安全的 Java 序列化效果。因此,不建议使用 XStreamMarshaller 从外部源(即 Web)解组 XML,因为这会导致安全漏洞。

您正在使用 Spring 的抽象XStreamMarshallerXStream库进行交互。默认情况下,该库可以编组/解组任意类(包括来自外部 Web 源)。

如果您不这样做(使用来自外部网络资源的类),您可以简单地忽略该消息。

如果您想删除消息,请遵循 Spring 官方文档(上面链接)和 XStream 网站(安全配置示例)中的建议。

归结为设置支持的类以确保只有注册的类有资格进行解组

此属性默认为空,这意味着 - 支持所有类 - 因此您会收到警告消息。

于 2018-04-01T08:40:46.323 回答