12

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

每当即将尝试危险操作时,Java 库中的代码都会咨询安全管理器。

那么,这究竟意味着什么?假设我已经实现了自己的安全管理器并为整个 JVM 启用了它。现在,java 运行时是否会为每个 java 调用(如 System.out.println() 等)咨询我的安全管理器,还是只咨询dangerousAPI 调用,如 System.exit() 、文件操作等?

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

我不是在质疑安全经理的可能性。我只是询问是否单独对危险的 api进行安全检查,还是对每个方法调用都进行安全检查。在具有大量代码的应用程序的情况下,这反过来会导致巨大的性能下降。

4

3 回答 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。

于 2011-03-04T11:27:28.337 回答
2

使用安全管理器,您可以控制对以下内容的访问:

  1. 文件操作
  2. 反射设施
  3. 读/写 IO
  4. 线程/线程组操作
  5. 套接字操作(监听、接受等)
  6. 创建自己的类加载器的能力。

对于每个这样的事情,SecurityManager 中都有一个 check*() 方法

如需详尽列表,请检查SecurityConstants中的常量

于 2011-03-04T11:24:26.270 回答
0

安全管理器使用策略文件来查看什么是允许的,什么是不允许的。由该策略文件确定的“危险”操作在执行期间被授予或拒绝。

您可以在此处找到有关 Sun/Oracle JVM 默认策略的更多详细信息:

http://download.oracle.com/javase/6/docs/technotes/guides/security/PolicyFiles.html

于 2011-03-04T11:24:16.100 回答