2010-07-30 99 views
3

我們正在開發一個applet,並需要它能夠讀/寫用戶臨時文件目錄中的文件(例如C:\ Documents and Settings \ USERNAME \ Local Settings \ Temp)。必須授予小程序寫入臨時文件的權限?

該applet已簽名,用戶在applet啓動時單擊'allow'選項,並且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文件授予所有的一切,則小程序工作正常,但這個顯然是不安全的。我們必須授予什麼最小權限才能允許小程序在用戶的臨時文件目錄中讀取/寫入/創建文件?

回答

6

使用策略文件對於測試還不錯,但是您不應該依賴它來完成代碼,特別是在授予文件權限時,這很危險。

要與文件進行交互,您需要執行以下操作。

  1. 登錄您的罐子 - 噸教程像this,你可以做一個自簽名的一個。

  2. 文件創建的代碼添加到一個特權塊下面是一個例子

    File myFile = (File) AccessController.doPrivileged(new PrivilegedAction() { 
    public Object run() 
    { 
        return new File("C:\\MyFolder\\MyFile"); 
    } 
    
    }); 
    
+0

您是否知道該權限的策略文件條目?我有我無法更改的代碼,我需要應用此策略。 – LostMohican 2015-09-30 17:25:05

+0

應該是這樣的, 授予{0}權限java.io.FilePermission「/ directory」,「讀取,寫入」; }; 如果你不想離開這個你不應該作爲一個漏洞的安全漏洞,你應該簽署該jar並執行授予原則或至少授予代碼庫。 – Keibosh 2016-03-14 18:03:31

0

得到了同一點。要授予儘可能最小所需權限,您可以授予${java.io.tmpdir}\-上的FilePermission,其動作爲read,write,delete。這對我有效。

當然,您必須將${...}替換爲系統屬性java.io.tmpdir的值。該屬性由java.io.File.createTempFile使用。

注意:someDir\-您授予遞歸訪問someDir路徑的所有子目錄。此時您可以使用someDir\*但我沒有測試過它。

如果您使用策略文件授予權限,那麼很有可能這些文件已支持引用系統屬性。但谷歌,再次肯定。如果您使用自定義策略實施,則可以輕鬆創建權限java.io.FilePermission