禁用当前线程的Javareflection

我需要调用一些半可信赖的Java代码,并希望禁用在代码执行期间使用reflection的能力。

try{ // disable reflection somehow someObject.method(); } finally{ // enable reflection again } 

可以使用SecurityManager来完成,如果是这样,怎么做?

澄清/上下文:这是关于限制可以从JavaScript / Rhino调用的包的另一个问题的后续行动。 接受的答案引用了关于如何做到这一点的博客条目,它需要两个步骤,第一个使用Rhino API(ClassShutter),第二个关闭reflection和Class.forName()。 我想我可以使用SecurityManager更干净地完成第二步(了解SecurityManager,正如已经指出的那样,它是一个复杂的野兽,一路走来)。

总而言之,我希望(从代码,而不是设置文件)关闭Class.forName()以及对整个reflection包的任何访问。

这取决于你想要限制的内容。

通常,可公开访问的API不受限制。 但是,只要您不授予不可信任的代码ReflectPermission("suppressAccessChecks")权限,它就无法访问另一个包中的非公共API。

如果您有要限制所有访问权限的程序包列表,则有两个步骤。 首先,在Security属性中, 在package.access列表中包含受限制的包 。 然后提供您信任的代码RuntimePermission("accessClassInPackage." + pkg)

区分不受信任代码的常用方法是从其他位置加载它,并在授予权限时引用策略文件中的不同代码库。

Java安全体系结构非常强大,但我知道它也很复杂; 如果你想要一个更具体的例子,请准确描述你想要限制的电话,我会尝试更明确。


在不修改java.policy文件和/或java.security文件的情况下执行您想要的操作将非常困难,也许是不可能的。 java.security.Policy表示java.policy的信息,但它不提供写访问权限。 只要任何现有的SecurityManager允许,您就可以创建自己的Policy实现并在运行时安装它。

另一方面,您可以将自定义java.policy文件指定为命令行选项。 如果您使用某种启动器提供完整的应用程序,则可能很容易实现。 它还为您的用户提供了一些透明度。 复杂的用户可以查看您希望授予应用程序的权限。

好吧,您可以覆盖SecurityManager.checkMemberAccess并给出更严格的定义。 但是,它并没有真正起作用。 例如,如果代码定义了终结者,会发生什么?

澄清:其他API使用reflection和其他API。 例如,java.beans,LiveConnect和Rhino。 例如,攻击者可以在脚本中创建一个没有快门的新Rhino上下文,从而引导到完整的JRE。 使用开放系统,黑名单永远无法完成。

总结:要使用Java安全模型,您需要使用它,而不是使用它。

我写了一个ClassShutter的替代品,它允许每个实例,每个方法,每个字段的细粒度访问控制:

http://riven8192.blogspot.com/2010/07/java-rhino-fine-grained-classshutter.html