我想创建一个限制性很强的安全管理器,因此我扩展了SecurityManager并覆盖了所有自定义的checkXXX方法。

但是后来我发现我的安全管理器没有用,因为任何人都可以:

System.setSecurityManager(null);

因此,我必须添加:
@Override    public void checkPermission(Permission perm)  {
    if (perm.getName().equals("setSecurityManager")) {
        throw new SecurityException("You shall have no other security manager but me!");
    }
}

还有更多惊喜吗?要使我的SecurityManager处于封闭状态,我还需要做其他事情吗?

最佳答案

我至少可以想到两件事:

  • 有人可以使用反射将System.security字段设置为可访问,然后将其设置为所需的任何内容。
  • 有人可以使用sun.misc.Unsafe用他们想要的任意随机对象直接覆盖内存中的实例。

  • 我认为您的SecurityManager可以防范这些情况,因为它们都依赖于对Field.setAccessible()的调用。但是最好对其进行测试以确保。

    关于java - SecurityManager惊喜,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6921979/

    10-10 13:52