9

有什么方法可以AccessController.doPrivileged与 new一起使用AccessControlContext限制对类/方法的访问?我想要一个子程序,它可以调用不受信任的代码,而无需访问文件系统或打开套接字。

具体的用例是,允许最终用户提供可以在有限权限下执行的代码或脚本片段(例如 Javascript 或 Groovy)。

我正在寻找的是一个普通的安全策略文件,其范围是用户提供的代码而不是整个 JVM。

4

3 回答 3

1

我现在不了解 AccessController 的方式。但是您可能可以使用以下方案来控制情况。您将需要有多个类加载器:首先将按原样加载类。第二个(或理想情况下,根据不受信任的代码源的数量),它将类转换为补丁或提供其特殊补丁版本而不是普通类。最后是系统类加载器,它实际上会执行例程。

也不要忘记保护 Classloader.getSystemClassLoader。对于转换对象,您可以使用 java 反射 API 或 objectweb asm 库。

于 2013-09-17T18:34:02.640 回答
1

Java-Sandbox正是为此而设计的工具。它可用于仅允许访问一组白名单类和受限方法的资源。它使用带有自定义类加载器和安全管理器的系统来实现这一点。不需要字节码操作或类似的技巧。

我没有使用过它,但它看起来设计得很好并且记录得很好。

来自其网站的示例代码:

class Untrusted extends SandboxedEnvironment<Object>() {
    @Override
    public Object execute() {
       /* untrusted code */
       return null;
    }
};

service.runSandboxed(Untrusted.class, context);
于 2013-11-17T20:51:57.360 回答
0

如果这是您正在寻找的东西

@PreAuthorize("hasRole('ROLE_USER')")
public void create(Contact contact);

您可能想看看 Spring Security, Expression-Based Access Control

于 2013-09-17T18:42:19.017 回答