Какие разрешения должны быть предоставлены апплетам для записи временных файлов? - PullRequest
3 голосов
/ 30 июля 2010

Мы разрабатываем апплет, и нам нужно, чтобы он мог читать / записывать файлы в каталоге временных файлов пользователя (например, C: \ Documents and Settings \ USERNAME \ Local Settings \ Temp).

Апплет подписан, пользователь щелкает опцию «разрешить» при запуске апплета, а на панели управления Java есть «Разрешить пользователю предоставлять разрешения для подписанного контента» и «Разрешить пользователю предоставлять разрешения для контента отнедоверенные полномочия "включены.

Однако при запуске мы получаем исключение SecurityException:

java.lang.SecurityException: Unable to create temporary file
at java.io.File.checkAndCreate(Unknown Source)
at java.io.File.createTempFile(Unknown Source)
at java.io.File.createTempFile(Unknown Source)
at com.jniwrapper.util.AppletHelper.b(SourceFile:104)
at com.jniwrapper.util.AppletHelper.a(SourceFile:79)
at com.jniwrapper.util.AppletHelper.b(SourceFile:50)
at com.jniwrapper.util.AppletHelper.init(SourceFile:122)
at com.x.Y.init(Y.java:31)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Exception: java.lang.SecurityException: Unable to create temporary file

Если мы отредактируем файл java.policy, чтобы предоставить все всем, тогда апплет работает нормально, но это явно небезопасно.Какие минимальные разрешения мы должны предоставить, чтобы позволить апплету читать / записывать / создавать файлы в каталоге временных файлов пользователя?

Ответы [ 2 ]

6 голосов
/ 03 августа 2010

Использование файла политики нормально для тестирования, но вы не должны полагаться на него для готового кода, особенно если вы предоставляете разрешение на файл, это опасно.

Для взаимодействия с файлами необходимо сделать следующее.

  1. Подпишите свой jar - тонны учебников, таких как this , вы можете просто сделать самоподписанный.

  2. Добавьте код создания файла в привилегированный блок, вот пример

    File myFile = (File) AccessController.doPrivileged(new PrivilegedAction() {
    public Object run() 
    {
        return new File("C:\\MyFolder\\MyFile");
    }
    
    });
    
0 голосов
/ 14 октября 2016

Добрался до той же точки.Чтобы предоставить разрешение как можно ближе к тому, что необходимо минимально, вы можете предоставить FilePermission на ${java.io.tmpdir}\- с действиями read,write,delete.Это сработало для меня.

Конечно, вы должны заменить ${...} значением системного свойства java.io.tmpdir.Это свойство используется java.io.File.createTempFile.

Примечание: С someDir\- вы предоставляете рекурсивный доступ ко всем подкаталогам пути someDir.На данный момент вы можете использовать someDir\*, но я не проверял его.

Если вы используете файлы политики для предоставления разрешений, есть большая вероятность, что эти файлы уже поддерживают ссылки на системные свойства.Но Google это снова, чтобы быть уверенным.Если вы используете пользовательскую реализацию политики, вы можете легко создать разрешение java.io.FilePermission.

...