我在更新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)
6条答案
按热度按时间eqoofvh91#
将其用作安全框架
您需要在XStream中配置安全框架。
它是为了防止对反序列化入口点的攻击而设计的。如果您可以声明没有不友好的第三方会使用它,那么使用到目前为止提供的解决方案是安全的。
我倾向于谨慎的一方。所以我只允许基本的,那些是我的,还有一些我用的。
最基本的
如其他答案中所述,首先使用默认值
∮那些属于我的∮
这些我允许包:
一些我用
对于我使用的特定类,可以允许它们以“按类”的方式为解析器提供信息。
为了消除问题中的异常,OP可以选择添加如下内容:
结论
XStream允许你尽可能严格地调整类反序列化的安全性。最低限度的安全性可能就足够了。但是不问自己一个问题是不够的:“我需要多严密的安全措施?”一旦你考虑了这个问题,就采取相应的行动。
ldioqlga2#
http://x-stream.github.io/security.html
尝试限制为所需的最低权限。
这将消除所有限制(阅读上面的链接):
xstream.addPermission(AnyTypePermission.ANY);
q5lcpyga3#
我用以下方法解决了这个问题:
nfg76nw04#
按照@Kokeb的回答,我得到了一个包含以下代码行的Spring Bean:
我补充道:
它解决了这个问题。
一点背景,我在一个项目中使用了XStream,其中包含Spring批处理、Spring集成和ActiveMQ,我设置了一个bean,将ActiveMQ消息转换为消息类。完整的bean:
xv8emn3q5#
我有一个XStreamMarshaller的派生类,其中“XStreamMarshaller.supports”方法被重写。我添加了***getXStream().allowTypes(classes)***,请参见下面的代码片段。
pod7payv6#
我也遇到过这个问题,我通过添加AnyTypePermission解决了这个问题。