这似乎是一个非常宽泛的问题,但我们将不胜感激。
我有一个用 java 编写的客户端/服务器解决方案,它使用 Cajo 项目(使用 RMI)。考虑到将在服务器和客户端之间传输的敏感数据,我只想尝试让我的解决方案尽可能安全。
到目前为止,我的想法是让我的所有类都成为“最终类”,并为我在服务器中的所有类抛出一个“不可序列化”的异常(除了 RMI 注册表中绑定(bind)的对象,以及任何当然实际上确实需要转移)。
谁能想到任何其他想法?
我知道有人可以编写恶意客户端 - 这并不难,因为您可以使用反射找到远程对象的 API。但是,我能做些什么来保护恶意客户端访问服务器中他们不应该访问的类/对象吗?
非常感谢
更新: 感谢大家提供有用的提示,很抱歉这么长时间才回复您。我目前的思路是建立一个安全的系统:
- 在客户端和服务器之间使用 OpenVPN。这意味着您需要访问物理客户端才能获得访问权限。 (N.B. 由于以下2点,VPN实际上会在服务器和办公室局域网之间。我觉得这样就足够安全了)
- 使用用户名和密码(可能使用 JBOSS)在服务器和客户端之间进行身份验证。这意味着要在服务器上完成任何操作,攻击者需要用户名和密码。
- 为所有对象抛出一个“不可串行化”的异常,除了那些实际上应该通过网络发送的对象。这会阻止敏感对象通过网络发送。
这听起来公平吗?如果我遗漏了什么,请纠正我。
进一步更新:似乎对我要防止的内容有些混淆。我要防止的是有人“入侵”服务器。例如,基本上是利用服务器转储/删除其整个数据库。
谢谢
最佳答案
保护通过 RMI 与可能受到危害的系统连接的系统非常困难。首先要做的是使用 java.rmi.server.useCodebaseOnly
系统属性禁用 RMI 的动态代码加载功能 - 不再有移动代码(通过此 channel )。正如 RMI 人员 Stuart Marks 所说,此属性现在默认情况下是安全的,符合 Oracle 政策。
关于java - 使用 RMI 编写安全的 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2869771/