com.thoughtworks.xstream.security.ForbiddenClassException将其用作安全框架

2022-09-04 07:01:08

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

谢谢,卡西克

引发异常的实际调用:

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

其中 testData 是 xml 字符串

测试列表.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;
}

项目.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和setters。

例外:

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)

答案 1

将其用作安全框架

您需要在 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 允许您根据需要调整类的反序列化的安全性。用最低限度可能就足够了。但是,不问自己这样一个问题是不够的:“我需要这种安全感有多严格?一旦你反思了这件事,就采取相应的行动。


答案 2

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

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

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


推荐