在Java中限制文件访问

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (16)

在我的Java应用程序(不是小程序)中,我希望限制某些文件操作到除了不应受限制的列表/组/包类以外的所有类。

具体来说,我想限制...

  • File reads
  • File writes
  • File creation
  • File deletion

...只能在当前工作目录内完成除了不受限制的类之外的所有工作目录。

SecurityManager尝试: 我试图实现SecurityManager类的一个子类来实现这种行为,但似乎在进行检查时,提供的文件信息不仅仅给出文件名(除非我错过了某些内容?)。

另外,我不太明白在这种情况下,我可以找出正在调用的类,以便确定是允许操作还是抛出异常。有什么方法可以获得我需要的这种方法的所有信息?

基于策略的尝试: 我也知道Java策略旨在限制类的操作,包括诸如文件操作之类的操作。然而,我真的很努力地找到一个很好的资源来学习如何使用.policy文件来解决我的问题。

问题的总结:

1)有没有其他方法可能比我提到的方法更可取?

2)这可能使用SecurityManager吗?我是否错过了我应该如何实施这种方法?

3)这可能使用策略文件吗?我在这方面有没有好的资源?

我真的没有受到任何艰苦的工作,我需要投资于实现这一点 - 我只是不确定我应该如何正确处理它。我也缺乏足够的资源来教我足够的关于我提到的两种可能的方法,以便让我自己实现它。最重要的是,我不惧怕重要的阅读需要!

感谢您提前给予的任何帮助。

提问于
用户回答回答于

以下是您如何使用策略文件进行操作的方法。

创建一个可以处理特权的Java文件:

package egPriv;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;

public class PrivCat {
    /** Cat a file with no privileges */
    public void cat(String file) throws IOException {
        cat(new FileReader(file));
    }

    private void cat(Reader r) throws IOException {
        int c;
        while( (c = r.read()) != -1 ) {
            System.out.print((char) c);
        }
        r.close();
    }

    /** Cat a file WITH privileges */
    public void catPriv(final String file) throws IOException {
        Reader r;
        try {
            r = AccessController.doPrivileged(new PrivilegedExceptionAction<Reader>() {
                public Reader run() throws IOException {
                    return new FileReader(file);
                }
            });
        } catch (PrivilegedActionException e) {
            throw (IOException) e.getCause();
        }
        cat(r);
    }
}

创建一个用于演示的常规文件

package eg;

import egPriv.PrivCat;

import java.io.IOException;

public class Cat extends PrivCat {
    public static void main(String[] args) throws IOException {
        Cat eg2 = new Cat();
        System.out.println("Processing with privilege:");
        eg2.catPriv(args[0]);

        System.out.println("Processing normally");
        eg2.cat(args[0]);
    }
}

创建sample.policy文件:

/* anyone can read write and execute within current working dir */
grant {
  permission java.io.FilePermission "${user.dir}", "read,write,execute";
};

grant {
  permission java.io.FilePermission "${user.dir}/*", "read,write,execute,delete";
};


/* Only code from this jar can work outside of CWD */
grant codebase "file:egPriv.jar" {
  permission java.io.FilePermission "<<ALL FILES>>", "read,write,execute,delete";
};

编译然后测试:

jar cvf egPriv.jar egPriv
jar cvf eg.jar eg


echo 'Restricted' > ..\file.txt
java -cp eg.jar;egPriv.jar -Djava.security.manager -Djava.security.policy=sample.policy  eg.Cat ..\file.txt

echo 'Open' > file.txt
java -cp eg.jar;egPriv.jar -Djava.security.manager -Djava.security.policy=sample.policy  eg.Cat file.txt

扫码关注云+社区