java - 为当前线程禁用 Java 反射

标签 java security reflection sandbox securitymanager

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

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

这可以用 SecurityManager 来完成吗?如果可以,怎么做?

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

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

最佳答案

这取决于您要限制的内容。

一般而言,可公开访问的 API 不受限制。但是,只要您不授予不可信代码 ReflectPermission("suppressAccessChecks")许可,它将无法访问另一个包中的非公共(public) API。

如果您有一个要限制所有访问的包列表,则有两个步骤。首先,在 Security 属性中,include the restricted package in the package.access list .然后给你的信任代码RuntimePermission("accessClassInPackage."+ pkg)

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

Java安全架构很强大,但我知道它也很复杂;如果你想要一个更具体的例子,请准确描述你想要限制的调用,我会尽量更明确。


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

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

关于java - 为当前线程禁用 Java 反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/770635/

相关文章:

java - 如何在 PuTTY 中保存并运行 Java 文件?

java - 有没有像 : #{systemProperties ['environment_variable_name' ]} to get the system variable? 这样的语法

java - 如何通过java中的套接字发送html文件及其图像

security - 为什么java SIM卡安全通道返回 "do not match"?

ruby-on-rails - Redis To Go 等附加组件对 Heroku/EC2 安全吗?

android - 在 Android 应用程序中存储 key 的最佳方式

reflection - Kotlin 反射 - 检查属性是否具有类型

java - 检测对象是否覆盖了 toString()

c# - 使用 AutoMapper 动态映射包括数组在内的对象

java - AppEngine 实体的审核字段