【问题标题】:What permissions must be granted for applets to write temporary files?小程序写入临时文件必须授予哪些权限?
【发布时间】:2011-03-23 02:42:49
【问题描述】:

我们正在开发一个小程序,需要它能够读取/写入用户临时文件目录(例如 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 文件以授予一切权限,那么小程序可以正常工作,但这显然是不安全的。我们必须授予什么最小权限才能允许小程序在用户的临时文件目录中读取/写入/创建文件?

【问题讨论】:

    标签: java security file permissions applet


    【解决方案1】:

    达到了同样的目的。要授予尽可能接近最低要求的权限,您可以在 ${java.io.tmpdir}\- 上授予 FilePermission 并使用操作 read,write,delete。这对我有用。

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      1. 给你的 jar 签名 - 像 this 这样的大量教程,你可以做一个自签名的。

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

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

      【讨论】:

      • 您知道此权限的策略文件条目吗?我有无法更改的代码,我需要应用此策略。
      • 应该是这样的,授予{权限 java.io.FilePermission "/directory", "read, write"; };如果你不想让这个大开的,你不应该因为它是一个巨大的安全漏洞,你应该签署 jar 并执行授权原则或至少授权代码库。
      猜你喜欢
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 2011-06-19
      相关资源
      最近更新 更多