Java - RMI 代码注入

JavaEE - RMI code injection

我正在使用 EJB 容器和 EJB 开发 JavaEE 应用程序。

假设我有 class 学生:

class Student{
 private int id;

 private String resume;

 public void clearXss(){
  ///some logic to clear resume from js scripts
 }
}

我有一个独立的客户端和 JavaEE 服务器。客户端通过 RMI 连接到 EJB 容器。客户端传递 Student class.

的对象

我的问题:在对象方法上调用 clearXss 是否安全,还是必须执行外部方法?我的意思是:

class MyBean{
 private void save(Student student){...}

 public void saveStudent(Student student){
  sudent.clearXss();
  save(student);
 }
}

class MyBean{
 private void save(Student student){...}

 private String purifyXss(String string){...}

 public void saveStudent(Student student){
  student.setResume(purifyXss(student.getResume()))
  save(student);
 }
}

我害怕的是调用我们从不受信任的客户端获取的对象的安全方法。这就是为什么这是主要的安全问题。

这不是一个简单的问题。一方面,您很担心服务器端的代码注入。另一方面,据我所知,在 RMI 技术中,客户端对象将仅序列化 class 数据,在客户端没有方法,并在服务器端使用 class 的服务器版本恢复(反序列化),然后两者变体对于服务器端的方法注入是安全的。

题目有两部分没看懂

  1. 关于对象内部安全方法的问题。通常,与安全有关的所有事情都不应该是不涉及安全域的对象所关心的。从什么时候开始,学生对象应该在某些情况下处理其简历安全或不安全的方式。

  2. RMI 序列化和反序列化一个对象。通常这意味着根本不传输任何类型的字节码,也不加载任何 class。您指的是从 class(文件)服务器按需下载 class 文件。据我所知,您控制着这些服务器。您可以防止客户端向您发送未签名的 classes。所以这个不用担心。

作为结论,我想说:

  • 首先从域对象中获取每个安全方面的信息(除非它们属于该域)。为此,为自己创建一个实用程序 class / API。
  • 其次检查 class 服务器控件以及它们在 RMI 系统中的实现/配置方式 (http://docs.oracle.com/javase/tutorial/rmi/index.html)。他们在你的控制之下。如果任何客户端能够发送您的服务器 class 文件并且您的服务器必须接受它们,那将是一个巨大的问题。所以有一些简单的解决方案。