为什么在 java 中使用 java.security.SecurityManager 可以读取任何文件?
Why any file can be read with using java.security.SecurityManager in java?
我只想在我的 Java 程序中读取和写入一些文件。所以我用java.security.SecurityManager
来管理这个,但似乎不尽如人意。
Main.java
文件在下面
import java.io.*;
import java.util.*;
public class Main {
static private final String INPUT = "in.txt";
public static void main(String args[]) throws Exception {
FileInputStream instream = null;
BufferedReader reader = new BufferedReader(new FileReader(INPUT));
String tempString = null;
while ((tempString = reader.readLine()) != null) {
System.out.println(tempString);
}
}
}
和文件 /opt/java.policy
如下所示
grant {
permission java.io.FilePermission "./out.txt", "write";
};
那我运行
java -Xss64m -Xms16m -Xmx512m -Djava.security.manager -Djava.security.policy=/opt/java.policy Main
但是没有错误,输出就是in.txt
的样子。我尝试了其他文件并得到了相同的结果。为什么会这样?
来自Javadoc:
Please note: Code can always read a file from the same directory it's in (or a subdirectory of that directory); it does not need explicit permission to do so.
并不是说这是明确的。代码不是 'in' 目录:它是 从 当前工作目录执行的,这似乎就是这个意思。
我只想在我的 Java 程序中读取和写入一些文件。所以我用java.security.SecurityManager
来管理这个,但似乎不尽如人意。
Main.java
文件在下面
import java.io.*;
import java.util.*;
public class Main {
static private final String INPUT = "in.txt";
public static void main(String args[]) throws Exception {
FileInputStream instream = null;
BufferedReader reader = new BufferedReader(new FileReader(INPUT));
String tempString = null;
while ((tempString = reader.readLine()) != null) {
System.out.println(tempString);
}
}
}
和文件 /opt/java.policy
如下所示
grant {
permission java.io.FilePermission "./out.txt", "write";
};
那我运行
java -Xss64m -Xms16m -Xmx512m -Djava.security.manager -Djava.security.policy=/opt/java.policy Main
但是没有错误,输出就是in.txt
的样子。我尝试了其他文件并得到了相同的结果。为什么会这样?
来自Javadoc:
Please note: Code can always read a file from the same directory it's in (or a subdirectory of that directory); it does not need explicit permission to do so.
并不是说这是明确的。代码不是 'in' 目录:它是 从 当前工作目录执行的,这似乎就是这个意思。