我正在创建一个带有服务器的多人游戏,并使用序列化对象在它和客户端程序之间来回发送消息。这是我的通信代码的MCVE:
loop: while(true)
try {
Thread.yield();
Object raw = in.readObject();
NTask task = (NTask) raw;
processRequest(task);
} catch (IOException e){
break loop;
} catch (ClassCastException e) {
throw new SecurityWarning("Client is sending erroneous messages. Possible security breach.", raw);
} catch (Throwable e) {
e.printStackTrace();
}
其中NTask
是一组不同消息类型的超类,processTask
根据类型决定如何处理每个对象。
我的问题是这是否会给我的服务器带来安全漏洞。有人可以编写自己的代码,将对象发送到我的服务器,这会造成伤害,并让它在第5行抛出ClassCastException之前执行其恶意代码吗?
答案 0 :(得分:0)
如果用户向服务器发送服务器在其类路径中没有的类的对象,则服务器无法加载此类,因此无法使用实例化收到的对象。
用户可以做的是发送服务器知道的类的对象,但不尊重类的不变量(例如,向您发送具有空名称的任务,尽管不应该发生在普通用户身上。)
序列化对象主要包括发送对象的类名及其状态(即其所有字段的值)。不发送类的字节代码(即行为)。它是从本地类路径加载的。