【问题标题】:Java Security Manager - What does it check?Java 安全管理器 - 它检查什么?
【发布时间】:2011-07-08 18:08:49
【问题描述】:

article 关于 Java 安全性说:

Java 库中的代码参考 安全经理每当有危险 即将尝试操作。

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

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

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

【问题讨论】:

    标签: java securitymanager


    【解决方案1】:

    如果代码这样,它只会咨询 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()' 这样的无辜操作吗?
    • @dogbane :那么,策略文件呢?根据 jpkrohling 在下面的评论,安全经理是否使用它来查看允许和不允许的内容
    • @RubyDosa 我相信它默认检查System.out/err;我已经发布了a question 来确认这一点。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2010-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-06
        • 2015-01-18
        • 2010-10-20
        相关资源
        最近更新 更多