Estoy desarrollando una aplicación JavaEE usando un contenedor EJB y EJB.

Supongamos que tengo clase Estudiante:

class Student{
 private int id;

 private String resume;

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

Tengo un cliente independiente y un servidor JavaEE. El cliente se conecta a través de RMI al contenedor EJB. El cliente pasa objetos de la clase del estudiante.

Mi pregunta: ¿es seguro llamar a clearXss en el método del objeto, o es necesario utilizar un método externo? Quiero decir:

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);
 }
}

Lo que temo es llamar a los métodos de seguridad de los objetos que obtenemos de un cliente que no es de confianza. Es por eso que esta es la pregunta de seguridad principal.

0
user2022068 17 feb. 2015 a las 19:28

2 respuestas

La mejor respuesta

No es una pregunta sencilla. Por un lado, está bastante preocupado por la inyección de código en el lado del servidor. Por otro lado, hasta donde yo sé, en la tecnología RMI, el objeto cliente se serializará solo los datos de la clase sin métodos en el lado del cliente y se restaurará (deserializará) en el lado del servidor con la versión del servidor de la clase, y luego ambas variantes son seguras contra la inyección de método en el servidor lado.

0
Alexander Fedyukov 25 feb. 2015 a las 11:26

No entiendo dos partes de las preguntas.

  1. La pregunta sobre los métodos de seguridad dentro de los objetos. Por lo general, todo lo que tiene que ver con la seguridad no debería ser motivo de preocupación para un objeto que no se ocupa del dominio de seguridad. ¿Desde cuándo un estudiante debe lidiar con la forma en que su currículum es seguro o inseguro en determinadas circunstancias?

  2. RMI serializa y deserializa un objeto. Por lo general, esto significa no transferir ningún tipo de código de bytes ni cargar ninguna clase. A lo que se refiere es a descargar archivos de clases a pedido desde un servidor de clases (archivos). Como sé, usted tiene el control de estos servidores. Puede evitar que los clientes le envíen clases sin firmar. Así que esto no es motivo de preocupación.

Como conclusión diría:

  • Primero, obtenga todos los aspectos de seguridad de los objetos de dominio (a menos que pertenezcan a ese dominio). Cree usted mismo una clase de utilidad / API para eso.
  • En segundo lugar, verifique los controles del servidor de clases y cómo se implementan / configuran dentro del sistema RMI (http : //docs.oracle.com/javase/tutorial/rmi/index.html). Están bajo tu control. Sería un gran problema si cualquier cliente pudiera enviar archivos de clase a sus servidores y su servidor tuviera que aceptarlos. Así que hay soluciones fáciles para eso.
0
Martin Kersten 2 mar. 2015 a las 09:59