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