当前位置: 首页 > 面试题库 >

限制Java中的文件访问

丁翰海
2023-03-14
问题内容

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

具体来说,我想限制…

  • 文件读取
  • 文件写入
  • 档案建立
  • 文件删除

…这样它们只能在当前工作目录中对所有非受限类进行处理。

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


 类似资料:
  • 问题内容: 我增加了Macbook Pro的最大文件限制,以便Elasticsearch可以处理更多文件,但是不起作用。 我运行命令’ulimit -a’,它说“打开文件”是100,000。我可以运行一个简单的shell脚本,如下所示: 而且我能够创建很多文件(在杀死脚本之前已超过60,000)。 但是,使用Java代码在“ / tmp”目录的空子目录中创建RandomAccessFiles,在得

  • 我在Echo Studio 3上从事一个Java项目。我有一个显示Pdf文件的servlet。我使用一个按钮调用此servlet,该按钮使用以下代码打开一个新窗口: 我只允许单击此按钮的用户访问此servlet,但我不知道如何处理此问题。 任何想法?

  • 问题内容: 我的代码中有此导入: 但我得到以下错误: 并且如果它可以帮助我的IDE蚀,我该如何解决此错误? 问题答案: 在这里看看:由于对所需库rt.jar的限制而导致对类的访问限制? 它并非与您的问题完全相同,但有些答案是相关的。这是引号: http://www.digizol.com/2008/09/eclipse-access-restriction-on- library.html 最适合

  • 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性: >>> bart = Student('Bart Simpson', 98) >>> bart.score 98 >>> bart.score = 59 >>> bart.sc

  • 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性: >>> bart = Student('Bart Simpson', 59) >>> bart.score 59 >>> bart.score = 99 >>> bart.sc

  • 问题内容: 有没有一种方法可以将文本字段限制为仅允许数字0-100,从而排除字母,符号等?我已经找到了一种方法,但是它比看起来必要的方法复杂得多。 问题答案: 如果必须使用文本字段,则应将JFormattedTextField与NumberFormatter一起使用。您可以设置NumberFormatter上允许的最小值和最大值。 但是,Johannes建议使用JSpinner(如果适合您的用例)