java - 在 Java 中限制文件访问

标签 java io policy securitymanager

问题:
在我的 Java 应用程序(不是小程序)中,我希望将某些文件操作限制为所有类,但不应限制的类的列表/组/包除外。

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

  • 文件读取
  • 文件写入
  • 文件创建
  • 文件删除

...这样它们只能在当前工作目录中完成,但不受限制的类除外。

SecurityManager 尝试:
我试图实现实现此行为的 SecurityManager 类的子类,但是似乎在进行检查时,提供的 file 信息不仅仅提供文件名(除非我遗漏了什么? )。

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

基于策略的尝试:
我还知道 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

关于java - 在 Java 中限制文件访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5526008/

相关文章:

java - CompareTo() 在两个不同的类中,其中一个不可访问

java 在屏幕上打印数组列表元素,但等待用户按 Enter 打印下一个

java - instanceof List 和 instanceof List<?> 的区别

java - 如何从头到尾读取一个文件?

c - 使用fgetc逐行读取不起作用

text-editor - 在当今时代,是否有合理的理由强制代码文件的最大宽度为 80 个字符?

azure - 允许的资源类型策略

Facebook 隐私政策 URL : Bad Response Code: URL returned a bad HTTP response code

javax.validation.Validation 多重实例化与重用单个 Validator 实例

java - AES 加密 Android <-> iOS 消息长度 > 15 字节的不同结果