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 的服务器版本恢复(反序列化),然后两者变体对于服务器端的方法注入是安全的。
题目有两部分没看懂
关于对象内部安全方法的问题。通常,与安全有关的所有事情都不应该是不涉及安全域的对象所关心的。从什么时候开始,学生对象应该在某些情况下处理其简历安全或不安全的方式。
RMI 序列化和反序列化一个对象。通常这意味着根本不传输任何类型的字节码,也不加载任何 class。您指的是从 class(文件)服务器按需下载 class 文件。据我所知,您控制着这些服务器。您可以防止客户端向您发送未签名的 classes。所以这个不用担心。
作为结论,我想说:
- 首先从域对象中获取每个安全方面的信息(除非它们属于该域)。为此,为自己创建一个实用程序 class / API。
- 其次检查 class 服务器控件以及它们在 RMI 系统中的实现/配置方式 (http://docs.oracle.com/javase/tutorial/rmi/index.html)。他们在你的控制之下。如果任何客户端能够发送您的服务器 class 文件并且您的服务器必须接受它们,那将是一个巨大的问题。所以有一些简单的解决方案。
我正在使用 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 的服务器版本恢复(反序列化),然后两者变体对于服务器端的方法注入是安全的。
题目有两部分没看懂
关于对象内部安全方法的问题。通常,与安全有关的所有事情都不应该是不涉及安全域的对象所关心的。从什么时候开始,学生对象应该在某些情况下处理其简历安全或不安全的方式。
RMI 序列化和反序列化一个对象。通常这意味着根本不传输任何类型的字节码,也不加载任何 class。您指的是从 class(文件)服务器按需下载 class 文件。据我所知,您控制着这些服务器。您可以防止客户端向您发送未签名的 classes。所以这个不用担心。
作为结论,我想说:
- 首先从域对象中获取每个安全方面的信息(除非它们属于该域)。为此,为自己创建一个实用程序 class / API。
- 其次检查 class 服务器控件以及它们在 RMI 系统中的实现/配置方式 (http://docs.oracle.com/javase/tutorial/rmi/index.html)。他们在你的控制之下。如果任何客户端能够发送您的服务器 class 文件并且您的服务器必须接受它们,那将是一个巨大的问题。所以有一些简单的解决方案。