JavaEE - RMI代码注入

时间:2015-02-17 16:28:41

标签: java security java-ee ejb rmi

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

假设我有班级学生:

class Student{
 private int id;

 private String resume;

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

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

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

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

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

VS

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

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

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

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

2 个答案:

答案 0 :(得分:0)

这不是一个简单的问题。一方面你很担心服务器端的代码注入。另一方面,据我所知,在RMI技术中,客户端对象将仅在客户端无需方法的类数据序列化,并在服务器端使用类的服务器版本进行恢复(反序列化),然后这两种变体都可以安全地防止服务器上的方法注入侧。

答案 1 :(得分:0)

我不理解问题的两个部分。

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

  2. RMI序列化和反序列化对象。通常这意味着不会传输任何类型的字节码,也不会加载任何类。您所指的是来自类(文件)服务器的按需下载类文件。我知道你控制着这些服务器。您可以阻止客户端表单向您发送未签名的类。所以这无关紧要。

  3. 作为结论我会说:

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