Java安全管理器 - 它检查什么?

12

这篇关于Java安全性的文章指出:

Java库中的代码在尝试执行危险操作时会咨询安全管理器。

那么,这是什么意思呢?假设我已经实现了自己的securitymanager并将其启用到了整个JVM,现在Java运行时是否会针对每个Java调用(例如System.out.println()等)都咨询我的securitymanager,还是只会在进行危险API调用时(如System.exit(),文件操作等)进行咨询呢?

编辑: 让我澄清一下我的问题,

我不质疑SecurityManager的可能性。我只是想知道安全检查是否仅限于危险的API,或者它是针对每个方法调用进行的。如果是后者,在具有大量代码的应用程序中会导致严重的性能退化。

3个回答

17

只有在代码需要时,它才会咨询SecurityManager。它不会为每个操作都这样做。

例如,在Runtime.exit中,可以看到会咨询SecurityManager:

public void exit(int status) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
    security.checkExit(status);
}
Shutdown.exit(status);
}

同样地,在File中,大多数方法都会查询SecurityManager。例如:

public boolean canWrite() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
    security.checkWrite(path);
}
return fs.checkAccess(this, FileSystem.ACCESS_WRITE);
}

如果你正在编写一个可能会“危险”的方法,那么你还应该咨询SecurityManager。


那么,它不会检查像“System.out.println()”这样的无辜操作吗? - RubyDosa
@dogbane:那么,策略文件呢?安全管理器不是使用它来查看根据jpkrohling的评论允许什么和不允许什么吗? - ironwood
@RubyDosa 我相信默认情况下它不会检查 System.out/err;我已经发布了一个问题来确认这一点。 - dimo414

2
使用安全管理器,您可以控制对以下内容的访问:
  1. 文件操作
  2. 反射功能
  3. 读/写 IO
  4. 线程/线程组操作
  5. 套接字操作(监听、接受等)
  6. 创建自己的类加载器的权限。
对于每个这样的内容,SecurityManager 中都有一个 check*() 方法。
要获取详尽列表,请查看 SecurityConstants 中的常量。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接