gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:11:08 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com