我编写了一个简单的 RMI 应用程序。我发现客户端获取RMI-Registry后可以成功执行Registry.unbind()方法。在我看来,这是一个安全风险。为什么允许客户端取消绑定远程注册表中的名称?邪恶的人可以通过修改代码来做到这一点,而我的所有其他客户端都无法连接到我的服务器,因为绑定已被删除。
是否有可能否认这一点,也许在 Java 政策中?
我编写了一个简单的 RMI 应用程序。我发现客户端获取RMI-Registry后可以成功执行Registry.unbind()方法。在我看来,这是一个安全风险。为什么允许客户端取消绑定远程注册表中的名称?邪恶的人可以通过修改代码来做到这一点,而我的所有其他客户端都无法连接到我的服务器,因为绑定已被删除。
是否有可能否认这一点,也许在 Java 政策中?
仅当客户端与注册表在同一主机上运行时,才会发生这种情况。如果您自己的客户遇到安全问题,那么您遇到的问题比 RMI 可以为您解决的任何问题都要大得多。
来自注册表的Javadoc:
Registry 实现可以选择限制对其部分或全部方法的访问(例如,改变注册表绑定的方法可能仅限于来自本地主机的调用)。如果 Registry 方法选择拒绝对给定调用的访问,则它的实现可能会抛出 AccessException,它(因为它扩展 RemoteException)在被远程客户端捕获时将被包装在 ServerException 中。
如果您愿意,您可以选择阻止这种行为(它实际上是大多数注册表实现的默认行为)。