禁用当前线程的Java反射

Thi*_*ilo 20 java security reflection sandbox securitymanager

我需要调用一些半可靠的Java代码,并希望禁用在代码执行期间使用反射的功能.

try{
   // disable reflection somehow
   someObject.method();
}
finally{
   // enable reflection again
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

eri*_*son 19

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

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

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

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

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


在不修改java.policy文件和/或java.security文件的情况下做你想做的事情会非常困难,也许是不可能的.该java.security.Policy代表的信息java.policy,但它并没有提供写访问.您可以创建自己的Policy实现并在运行时安装它,只要任何现有的SecurityManager允许它.

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


Tom*_*ine 5

好吧,您可以覆盖SecurityManager.checkMemberAccess并给出更严格的定义。然而,它并不是那样工作的。例如,如果代码定义了终结器,会发生什么?

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

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