java 安全性,禁止类异常

jjhzyzn0  于 2023-03-11  发布在  Java
关注(0)|答案(6)|浏览(517)

我在更新xstream时遇到这个异常(1.4.8)lib到我们的一个web应用程序的最新版本。异常是从一个依赖jar的pojo中抛出的,该jar是使用旧版本的xstream编译的(1.3.1)重新编译并构建了新的jar(dependent jar)使用xstream-1. 4. 8并再次部署war文件,但仍然得到同样的异常,最初我以为这是由于版本不匹配,我现在不确定是什么导致了这个异常,而且网上也没有太多的文档。有什么想法吗?
谢谢,卡蒂克
引发异常的实际调用:

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

其中testData是xml字符串
TestList.java 课程

@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;
}

Item.java 课程:

@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)
eqoofvh9

eqoofvh91#

将其用作安全框架

您需要在XStream中配置安全框架。
它是为了防止对反序列化入口点的攻击而设计的。如果您可以声明没有不友好的第三方会使用它,那么使用到目前为止提供的解决方案是安全的。
我倾向于谨慎的一方。所以我只允许基本的,那些是我的,还有一些我用的。

最基本的

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

XStream xstream = new XStream();
xstream .addPermission(NoTypePermission.NONE); //forbid everything
xstream .addPermission(NullPermission.NULL);   // allow "null"
xstream .addPermission(PrimitiveTypePermission.PRIMITIVES); // allow primitive types

∮那些属于我的∮
这些我允许包:

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允许你尽可能严格地调整类反序列化的安全性。最低限度的安全性可能就足够了。但是不问自己一个问题是不够的:“我需要多严密的安全措施?”一旦你考虑了这个问题,就采取相应的行动。

ldioqlga

ldioqlga2#

http://x-stream.github.io/security.html
尝试限制为所需的最低权限。
这将消除所有限制(阅读上面的链接):xstream.addPermission(AnyTypePermission.ANY);

q5lcpyga

q5lcpyga3#

我用以下方法解决了这个问题:

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

nfg76nw04#

按照@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,我设置了一个bean,将ActiveMQ消息转换为消息类。完整的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;
    }
xv8emn3q

xv8emn3q5#

我有一个XStreamMarshaller的派生类,其中“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);
}
pod7payv

pod7payv6#

我也遇到过这个问题,我通过添加AnyTypePermission解决了这个问题。

xstream.addPermission(AnyTypePermission.ANY);

相关问题