#java #безопасность
public class Worker { private static String path; public static void main(String[] argv) throws Exception { path = "C:\\glassfish-4.1.1\\glassfish4\\README.txt"; Permission permission = new FilePermission(path, "read"); try { AccessController.checkPermission(permission); }catch (Exception e){ System.out.printf(String.valueOf(e)); } System.out.println(new FileInputStream(new File(path)).read()); } } Этот класс вернет что-то похожее на java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\glassfish-4.1.1\glassfish4\README.txt" "read")84 Почему удалось прочитать из файла, когда прав на это нет!?
Ответы
Ответ 1
Для ограничения доступа к файлам в файловой системе используются методы класса File setExecutable() setReadable() setWritable() Пример, который приводите вы, относится к настройке SecurityManager. Это механизм который позволяет ограничивать Java приложению доступ к определенным ресурсам (не только файлам). В качестве примера, возьмем апплеты - SecurityManager не дает им доступа к файловой системе. Почувствуйте разницу - SecurityManager не модифицирует права файла в файловой системе, а запрещает Java приложению совершать с ним определенные действия. В этом и смысл класса Permission, и наследуемых от него классов - они описывают эти действия. Файл у вас прочитался потому что в JDK, по умолчанию, SecurityManager отключен. Проверить это можно таким образом: System.out.println(System.getSecurityManager()); // null, если отключен Запустите приложение с ключом VM -Djava.security.manager и файл у вас прочитать не получится, до тех пор пока не будет настроена соответствующая security policy. Дефолтные лежат в $JAVA_HOME/lib/security. public static void main(String[] args) throws FileNotFoundException, IOException { System.out.println(System.getSecurityManager()); String path = "D:/test/file.txt"; check(path, "read,write"); System.out.println(new FileInputStream(new File(path)).read()); } static void check(String path, String actions) { FilePermission perm = new FilePermission(path, actions); try { AccessController.checkPermission(perm); } catch (Exception e) { System.out.println(e); } } Подробнее смотрите в официальной документации.
Комментариев нет:
Отправить комментарий