Почему мы можем изменить атрибуты файла только для чтения в Java? - PullRequest
0 голосов
/ 09 апреля 2019

Рассмотрим следующий код:

import java.io.IOException;
import java.nio.file.attribute.DosFileAttributeView;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileTime;
import java.time.Instant;

public class Word {
    public static void main(String[] args){

        try{
            Path path = Paths.get("readonly.txt");
            Files.createFile(path);
            DosFileAttributeView dos = Files.getFileAttributeView(path,DosFileAttributeView.class);
            dos.setReadOnly(true);

            //Files.delete(path); Access denied exception

            dos.setHidden(true);            //can change attributes all we want
            dos.setTimes(null,FileTime.from(Instant.now()),null);
            dos.setReadOnly(false);

            Files.delete(path);
        }
        catch(IOException e){
            e.printStackTrace();
        }


    }
}

Естественно, попытка изменить файл только для чтения даст нам AccessDeniedException .Тем не менее, как показано в коде, это не относится к атрибутам файла, которые можно изменить, как мы захотим.

Конечно, это означает, что любой может легко изменить атрибут «только для чтения» обратно на «ложь» и изменить файл так, как он хочет.

Итак, как это разрешено и как кто-то может это сделать?создать фактический файл только для чтения в Java?

1 Ответ

1 голос
/ 09 апреля 2019

Безопасность файлов Windows контролируется дескриптором безопасности в файле.

Конечно, это означает, что любой может легко просто изменить атрибут «только для чтения» обратно на false и изменить файл все, что онхочу.

Не «кто-либо» - это могут делать только те люди, которые имеют разрешение (см. ниже).Если вы создали файл, то неудивительно, что вы можете делать то, что хотите.В целом, однако, я ожидаю, что другие пользователи (не являющиеся администраторами) не смогут повлиять на ваши файлы по умолчанию.

Кто может изменять атрибуты DOS, контролируется с помощью дескриптора безопасности - в частности, путем предоставления FILE_WRITE_ATTRIBUTESдоступ или нет.Естественно, кто-то должен иметь возможность очистить атрибут DOS только для чтения, в противном случае ... после того, как файл был помечен только для чтения, обратного пути не будет.Как правило, если вы создаете файл, вы имеете полный контроль над ним.

Возможность записи данных в файл данным пользователем или группой пользователей контролируется битом FILE_WRITE_ACCESS (и, возможно, некоторыми другими, ноэто вводный ответ) в маске доступа.Если вы не предоставляете права на запись пользователям, они не могут писать.Если вы действительно хотите запретить кому-либо писать в файл, вот как вы это делаете.

Атрибут DOS «только для чтения» существует для совместимости и может быть полезен в качестве подсказки, которую вы на самом деле не хотитедля записи в этот файл, но это не ограничение безопасности.

Ничто из этого не имеет ничего общего с Java, это то, как работает файловая система в ОС.Вы можете проверить параметры безопасности в файле с помощью проводника Windows.

...