我正在编写一个使用Java RMI(通过Cajo项目)的客户端 - 服务器解决方案。
我想让服务器尽可能安全。据我所知,通过使用Java反射,恶意客户端将能够查看任何给定对象内的所有方法名称和字段名称,这些对象已被绑定在RMI regestry中或从服务器“代理”(在Cajo中,代理项目是实际驻留在服务器上但客户端可以引用它的对象)。但是,恶意客户端是否能够查看任何程序逻辑,或修改服务器上的任何代码?或者查看字段的实际内容呢?
请假设不允许对服务器进行物理访问,并且对服务器的唯一网络访问是通过Cajo TCP端口(1198)。
由于
答案 0 :(得分:2)
RMI基于代理对象和序列化。
代理对象:这些对象只包含接口中指定的方法,原始对象的所有其他方法和字段在代理中不存在,无法通过反射访问。由于所有方法都已在界面中公开,因此无法进行攻击。
序列化对象:服务器端值的一对一副本,可以在客户端上访问所有方法和字段,但是客户端副本的更改不会转发到服务器,因为两个副本都是独立的。具有已修改字段的对象仍可用作RMI方法的参数,因此请验证服务器上的输入。
答案 1 :(得分:0)
我理解通过使用Java 反思,恶意客户会 能够查看所有方法名称和 任何给定对象内的字段名称 这已经受到RMI的约束 从服务器重新设置或“代理”
正确。但 那些字段是什么?只是一个IP地址:端口和被代理方法的一些幻数。没有什么可担心的,没有任何东西暴露出客户不能通过正常方式使用。
然而,恶意客户端是否能够 查看任何程序逻辑,或修改任何 服务器上的代码?
没有。除了通过代理之外,它没有任何访问服务器的权限。它根本看不到实际的远程对象实现。
或者查看字段的实际内容怎么样?
不,出于同样的原因。