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