有什么方法可以AccessController.doPrivileged
与 new一起使用AccessControlContext
来限制对类/方法的访问?我想要一个子程序,它可以调用不受信任的代码,而无需访问文件系统或打开套接字。
具体的用例是,允许最终用户提供可以在有限权限下执行的代码或脚本片段(例如 Javascript 或 Groovy)。
我正在寻找的是一个普通的安全策略文件,其范围是用户提供的代码而不是整个 JVM。
有什么方法可以AccessController.doPrivileged
与 new一起使用AccessControlContext
来限制对类/方法的访问?我想要一个子程序,它可以调用不受信任的代码,而无需访问文件系统或打开套接字。
具体的用例是,允许最终用户提供可以在有限权限下执行的代码或脚本片段(例如 Javascript 或 Groovy)。
我正在寻找的是一个普通的安全策略文件,其范围是用户提供的代码而不是整个 JVM。
我现在不了解 AccessController 的方式。但是您可能可以使用以下方案来控制情况。您将需要有多个类加载器:首先将按原样加载类。第二个(或理想情况下,根据不受信任的代码源的数量),它将类转换为补丁或提供其特殊补丁版本而不是普通类。最后是系统类加载器,它实际上会执行例程。
也不要忘记保护 Classloader.getSystemClassLoader。对于转换对象,您可以使用 java 反射 API 或 objectweb asm 库。
Java-Sandbox正是为此而设计的工具。它可用于仅允许访问一组白名单类和受限方法的资源。它使用带有自定义类加载器和安全管理器的系统来实现这一点。不需要字节码操作或类似的技巧。
我没有使用过它,但它看起来设计得很好并且记录得很好。
来自其网站的示例代码:
class Untrusted extends SandboxedEnvironment<Object>() {
@Override
public Object execute() {
/* untrusted code */
return null;
}
};
service.runSandboxed(Untrusted.class, context);
如果这是您正在寻找的东西
@PreAuthorize("hasRole('ROLE_USER')")
public void create(Contact contact);
您可能想看看 Spring Security, Expression-Based Access Control