java - Java 中的 SecurityManager 有没有办法选择性地授予 ReflectPermission ("suppressAccessChecks")?

标签 java reflection securitymanager

Java 中的 SecurityManager 是否有任何方法可以根据调用 setAccessible() 的详细信息选择性地授予 ReflectPermission("suppressAccessChecks")?我看不出有什么办法可以做到这一点。

对于某些沙盒代码,允许调用 setAccessible() 反射 API 将非常有用(例如用于运行各种动态 JVM 语言),但在调用 setAccessible() 时在源自沙盒代码的类的方法/字段上。

如果这不可能,除了选择性授予 ReflectPermission("suppressAccessChecks") 之外,还有其他建议吗?如果 SecurityManager.checkMemberAccess() 具有足够的限制性,也许在所有情况下都可以安全授予?

最佳答案

也许查看调用堆栈就足以满足您的目的?像这样的东西:

import java.lang.reflect.ReflectPermission;
import java.security.Permission;

public class Test {
    private static int foo;

    public static void main(String[] args) throws Exception {
        System.setSecurityManager(new SecurityManager() {
            @Override
            public void checkPermission(Permission perm) {
                if (perm instanceof ReflectPermission && "suppressAccessChecks".equals(perm.getName())) {
                    for (StackTraceElement elem : Thread.currentThread().getStackTrace()) {
                        if ("Test".equals(elem.getClassName()) && "badSetAccessible".equals(elem.getMethodName())) {
                            throw new SecurityException();
                        }
                    }
                }
            }
        });

        goodSetAccessible(); // works
        badSetAccessible(); // throws SecurityException
    }

    private static void goodSetAccessible() throws Exception {
        Test.class.getDeclaredField("foo").setAccessible(true);
    }

    private static void badSetAccessible() throws Exception {
        Test.class.getDeclaredField("foo").setAccessible(true);
    }
}

关于java - Java 中的 SecurityManager 有没有办法选择性地授予 ReflectPermission ("suppressAccessChecks")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2315066/

相关文章:

scala - 在 Scala 反射中,为什么构造函数参数隐藏 getter?

java - 无法从 jar 加载类定义

java - 为什么我不能导入 org.apache.spark.sql.DataFrame

java - jsp编码无法正确显示字符

java - 为什么这段代码在包装在通用函数中时不起作用?

python-3.x - 如何在 Flask-Appbuilder 中为 OAuth2.0 使用自定义提供程序 [keycloak]?

java - 全局并最终存储 SecurityManager 的检查是否可以接受

java - map 省略了一个大括号

c# - 如何捕获使用 MethodInfo.Invoke 调用的方法中抛出的异常?

javascript - 从Object生成JS类文件