com.thoughtworks.xstream.security.ForbiddenClassException

kar*_*hik 20 java xstream

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

谢谢,卡蒂克

抛出异常的实际调用:

TestList list = (TestList)xs.fromXML(new StringReader(testData));
Run Code Online (Sandbox Code Playgroud)

其中 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;
}
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

当然,我还有 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)
Run Code Online (Sandbox Code Playgroud)

man*_*cia 24

使用它作为安全框架

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

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

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

基础

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

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

那些属于我的

我通过包裹允许的这些:

xstream.allowTypesByWildcard(new String[] { 
        "com.mydomain.mynewapp.**",
        "com.mydomain.utilitylibraries.**
        });
Run Code Online (Sandbox Code Playgroud)

有些我用过

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

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

为了消除问题中的异常,OP 可以选择添加类似以下内容:

xstream.allowTypes(new Class[] {com.test.cp.test123.pojo.TestList.class});
Run Code Online (Sandbox Code Playgroud)

结论

XStream 允许您将类反序列化的安全性调整得尽可能严格。最少的可能就足够了。但不问自己这个问题是不够的:“我的安全需要有多严格?” 一旦你反思了这件事,就采取相应的行动。


小智 12

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

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

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