繁体   English   中英

com.thoughtworks.xstream.security.ForbiddenClassException

[英]com.thoughtworks.xstream.security.ForbiddenClassException

我在将 xstream (1.4.8) lib 更新到我们的 web 应用程序之一的最新版本时遇到了这个异常。 异常是从依赖 jar 的 pojo 中抛出的,它是使用旧版本的 xstream (1.3.1) 编译的。 我使用 xstream-1.4.8 重新编译并构建了新的 jar(依赖 jar)并再次部署了 war 文件,但仍然出现相同的异常。 最初我认为这是由于版本不匹配,我现在不确定是什么导致了这个异常并且在线文档不多。 有什么想法吗?

谢谢,卡尔提克

抛出异常的实际调用:

TestList list = (TestList)xs.fromXML(new StringReader(testData));

其中 testData 是 xml 字符串

测试列表.java class

@XStreamAlias("Assets")
public class TestList extends ParentObject {

@XStreamImplicit(itemFieldName = "item")
protected List<Item> item= new ArrayList<Item>();

public void add(Item item) {
item.add(item);
}

public List<Item> getItems() {
    if(item== null)
        return new ArrayList<Item>();
    else
        return item;
}

@Override
public String getStringData() {
StringBuilder builder = new StringBuilder();

for (Item item : items) {
    builder.append(item.getStringData());
    builder.append("---------------\n");
}

return builder.toString();
}

@Override
public String getDataType() {
// TODO Auto-generated method stub
return null;
}

商品 java class:

 @XStreamAlias("Item")
public class Item extends ParentItem {
@XStreamAsAttribute
public String access_test;

@XStreamAsAttribute
public int test_num;

@XStreamAsAttribute
public int test_type;

@XStreamAsAttribute
public boolean tst_item;

@XStreamAsAttribute
public int test_test_est;

@XStreamAlias("eset_test")
public List<Integer> eset_test;

当然,我还有这里不包括的 getter 和 setter。

例外:

com.thoughtworks.xstream.security.ForbiddenClassException: com.test.cp.test123.pojo.TestList
    at com.thoughtworks.xstream.security.NoTypePermission.allows(NoTypePermission.java:26)
    at com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:74)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
    at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:47)
    at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:133)
    at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1206)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1190)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1061)

http://x-stream.github.io/security.html

尝试限制为所需的最低权限。

这将消除所有限制(阅读上面的链接): xstream.addPermission(AnyTypePermission.ANY);

我使用以下方法解决了我的问题:

Class<?>[] classes = new Class[] { TestList.class, Item.class, ... };
XStream xstream = new XStream();
XStream.setupDefaultSecurity(xstream);
xstream.allowTypes(classes);

按照@Kokeb 的回答,我有一个 spring bean,其中包含以下代码行:

  XStreamMarshaller marshaller = new XStreamMarshaller();
  Map<String, Class<MyMessage>> aliases = new HashMap<>();
  aliases.put("myMessages", MyMessage.class);
  marshaller.setAliases(aliases);

我补充道:

 marshaller.getXStream().allowTypes(new Class[]{MyMessage.class});

它解决了这个问题。

一些上下文,我将 XStream 用于具有 spring 批处理、spring 集成和 ActiveMQ 的项目,我设置了一个将 ActiveMQ 消息转换为消息 class 的 bean。完整的 bean:

    @Bean
    public MessageConverter messageConverter() {
        XStreamMarshaller marshaller = new XStreamMarshaller();
        Map<String, Class< MyMessage >> aliases = new HashMap<>();
        aliases.put("myMessages", MyMessage.class);
        marshaller.setAliases(aliases);
        marshaller.getXStream().allowTypes(new Class[]{MyMessage.class});

        MarshallingMessageConverter messageConverter = new MarshallingMessageConverter(marshaller);
        messageConverter.setTargetType(MessageType.TEXT);
        return messageConverter;
    }

将其用作安全框架

您需要在 XStream 中配置安全框架。

它旨在防止对您的反序列化入口点的攻击。 如果您可以声明没有不友好的第三方会使用它,那么您对目前提供的解决方案是安全的。

我倾向于持谨慎态度。 所以我只允许基本的,那些是我的,还有一些我使用的。

基础知识

如其他答案中所述,首先使用默认值

XStream xstream = new XStream();
XStream.setupDefaultSecurity(xstream);

文档中所述,“它使用 Java 运行时的知名且简单类型的白名单初始化 XStream 实例。

那些属于我的

这些我通过包允许:

xstream.allowTypesByWildcard(new String[] { 
        "com.mydomain.mynewapp.**",
        "com.mydomain.utilitylibraries.**
        });

我用的一些

对于我使用的特定类,可以允许它们以“按类”方式提供解析器。

xstream.allowTypes(new Class[] {
        com.google.common.base.Present.class,
        org.apache.commons.math3.random.GaussianRandomGenerator.class
        });

为了摆脱问题中的异常,OP 可能会选择添加以下内容:

xstream.allowTypes(new Class[] {com.test.cp.test123.pojo.TestList.class});

结论

XStream 允许您根据需要调整类反序列化的安全性。 最低限度可能就足够了。 但不问你这个问题是不够的:“我需要多严格的安全措施?” 一旦你对此事进行了反思,就采取相应的行动。

我有 XStreamMarshaller 的派生 class,其中“ XStreamMarshaller.supports ”方法被覆盖。 我添加了getXStream().allowTypes(classes) ,请参见下面的代码片段。

@Override
public boolean supports(Class<?> clazz) {
    Class<?>[] classes = new Class[] {clazz};
    getXStream().processAnnotations(classes);
    getXStream().allowTypes(classes);
    return super. Supports(clazz);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM