Java 反射安全

Java 反射安全,java,security,reflection,securitymanager,Java,Security,Reflection,Securitymanager,如何通过不允许方法,字段,构造函数对象调用setAccessible(true)来强制反射安全性?安全策略文件还是其他什么 对于独立Java应用程序,通常不注册SecurityManager 我使用这个System.setSecurityManager(新的SecurityManager()) 这种方法适用于调用方法 我想强制执行整个jar或使用jar的客户机代码是不允许调用setAccessible(true) 还有更好的办法吗 谢谢。嗯,它确实适用于SetAccess。见: class A

如何通过不允许
方法
字段
构造函数
对象调用
setAccessible(true)
来强制反射安全性?安全策略文件还是其他什么

对于独立Java应用程序,通常不注册
SecurityManager

我使用这个
System.setSecurityManager(新的SecurityManager())

这种方法适用于调用方法

我想强制执行整个jar或使用jar的客户机代码是不允许调用
setAccessible(true)

还有更好的办法吗

谢谢。

嗯,它确实适用于SetAccess。见:

class A {
  private String method1() {
    return "Hello World!";
  }
}

导致

Exception in thread "main" java.security.AccessControlException: access denied ("java.lang.reflect.ReflectPermission" "suppressAccessChecks")
        at java.security.AccessControlContext.checkPermission(Unknown Source)
        at java.security.AccessController.checkPermission(Unknown Source)
        at java.lang.SecurityManager.checkPermission(Unknown Source)
        at java.lang.reflect.AccessibleObject.setAccessible(Unknown Source)
        at B.main(B.java:8)
它可能对您不起作用的一个原因是,根据中的注释,它在Java1.5中不起作用,但在Java6及其后的版本中起作用


编辑:要拒绝特定JAR的策略,您需要使用策略文件,例如:

// specific file
grant codeBase "file:/test/path/tools.jar" {
  // no permissions for this one
};

// default to giving all
grant {
  permission java.security.AllPermission;
};
有两种方法可以指定策略文件,要么将其作为默认值的附加项,要么只指定那些已指定的():

如果你使用

java -Djava.security.manager -Djava.security.policy==someURL SomeApp
(请注意,双等于)则只显示指定的策略文件 使用;安全属性文件中指示的所有内容都将被删除 忽略


…或实现自定义安全管理器,该管理器。不过我自己还没有这样做。

似乎也有同样的主题。我想在我的应用程序中强制禁止调用setAccessible方法。@peterwkc是的,我回答说你可以用SecurityManager来做这件事?如何用SecurityManager来做?你是说定制安全管理器吗?@peterwkc不,使用标准的,就像我的例子一样。但您需要使用策略文件或自定义安全管理器来仅针对特定的jar拒绝它。
java -Djava.security.manager -Djava.security.policy==someURL SomeApp