必须授予applet写入临时文件的权限?

时间:2010-07-30 07:14:42

标签: java security file permissions applet

我们正在开发一个applet,需要它能够读取/写入用户临时文件目录中的文件(例如C:\ Documents and Settings \ USERNAME \ Local Settings \ Temp)。

小程序已签名,用户在applet启动时单击“允许”选项,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文件以将所有内容授予所有内容,那么applet工作正常,但这显然是不安全的。我们必须授予哪些最小权限才能允许applet在用户的临时文件目录中读/写/创建文件?

2 个答案:

答案 0 :(得分:6)

使用策略文件可以进行测试,但是您不应该依赖它来完成代码,特别是在授予文件权限时,这很危险。

要与文件进行交互,您需要执行以下操作。

  1. 签署你的jar - 大量的教程,如this,你可以做一个自签名的教程。

  2. 将文件创建代码添加到特权块这里是一个示例

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

答案 1 :(得分:0)

得到同样的观点。要尽可能接近最低限度地授予权限,您可以在FilePermission上授予${java.io.tmpdir}\-行为read,write,delete。这对我有用。

当然,您必须将${...}替换为系统属性java.io.tmpdir的值。 java.io.File.createTempFile使用此属性。

注意:使用someDir\-,您可以授予对someDir路径的所有子目录的递归访问权限。此时您可以使用someDir\*,但我还没有测试过它。

如果您使用策略文件授予权限,那么这些文件很可能已经支持引用系统属性。但谷歌再次确定。如果您使用自定义策略实施,则可以轻松创建权限java.io.FilePermission