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

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

只要尝试执行危险操作,Java库中的代码就会查询安全管理器。

那么,这究竟意味着什么? 比如说,如果我已经实现了自己的安全管理器并为整个JVM启用了它。 现在,java运行库是否为每个java调用(如System.out.println()等)查询我的安全管理器,或者它只参考像System.exit(),文件操作等dangerous api调用?

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

我不是在质疑安全管理员的可能性。 我只是询问是否单独危险的api进行了安全检查或者是为每个方法调用完成了安全检查。 在具有大量代码的应用程序中,哪种情况会导致性能大幅下降。

如果代码如此,它只会咨询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。

使用安全管理器,您可以控制访问:

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

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

有关详尽列表,请检查SecurityConstants中的常量

安全管理器使用策略文件来查看允许的内容和不允许的内容。 执行期间授予或拒绝由此策略文件确定的“危险”操作。

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

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