小编Seb*_*ide的帖子

AccessController没有将类的ProtectionDomain考虑在内

上下文

我正在编写一个Java系统,其中代码在非常严格的沙箱中执行.一个查询(由一个或多个类组成)应该只允许在执行期间访问一个文件夹(以及文件夹中包含的子文件夹和文件).

我通过使用a SecurityManager和新的ClassLoader每个查询执行来强制执行沙盒.当在定义类的ClassLoader使用defineClass,我沿着传递ProtectionDomain包含应授予该文件的读取权限.

由于并非调用堆栈上的所有对象都具有所需的权限,因此查询中的读取操作在AccessController.doPrivileged(...)-block 中运行.

问题

  • 当我AccessController.checkPermission(...)doPrivileged(...)块内直接调用时,它会以静默方式返回
  • 当我调用System.getSecurityManager().checkPermission(...),将请求转发给AccessController,然后AccessController抛出异常.
  • ProtectionDomain似乎打电话时迷路AccessController通过SecurityManager
  • 受限制的文件操作(如创建一个java.io.FileReader),直接调用SecurityManager而不是AccessController.我如何获得的AccessController,通过调用时SecurityManager,要尊重ProtectionDomain调用该类别的doRestricted(...)-块?
  • 难道它SecurityManager本身没有所需的权限吗?因此,通过夹在特权代码之间的调用堆栈中,并AccessController生成一个没有的特权联合?

下面是一个示例部分:

AccessController.doPrivileged(new PrivilegedAction<QueryResult>() {
  public QueryResult run() {
    String location = folderName + "/hello";
    FilePermission p = new FilePermission(location, "read");
    try { …
Run Code Online (Sandbox Code Playgroud)

java security permissions sandbox securitymanager

6
推荐指数
1
解决办法
1457
查看次数

标签 统计

java ×1

permissions ×1

sandbox ×1

security ×1

securitymanager ×1