如何让applet读取客户端上的任何文件? (创建一个上传者)

时间:2014-01-14 21:05:06

标签: java security permissions applet

我正在编写一个Java文件上传器小程序,但我根本无法解决以下问题。 (上传者非常专业,因此我们不能只使用股票解决方案)。我有一个自签名的小程序,我试图在本地测试,但我不能让它读取本地文件。我有权限:清单中声明的​​所有权限。

如果我添加

<param name="permissions" value="all-permissions" />

到applet标签,它会抛出

com.sun.deploy.security.BlockedException: User has denied the privileges to the code

如果我避免这种情况,它会抛出

java.security.AccessControlException: access denied ("java.io.FilePermission" PATH_TO_FILE" "read")

在第一种情况下抛出了BlockedException,即使Java插件向我询问安全问题,我总是说“不要阻塞”,以便运行此代码。

我有什么想法可以测试这个吗?或者你能指出我可以检查的开源Java上传器applet实现吗?当然,该软件的部署版本将使用可信证书进行签名,但我需要一种方法来测试它....

谢谢!

更新

以下是需要做的事情:

鉴于我们开发的Web应用程序,此应用程序需要来自本地文件系统的许多小文件。因此,我们需要迭代目录结构并检查文件,以便找到Web应用程序所需的文件。这非常麻烦,因此我们需要自动执行此操作。

我想到了另外两种方法:

  1. JNLP-applet,但其API只能显示单个或多个文件的FileChooser,但不能显示目录
  2. 一个普通的旧Java客户端应用程序,它将找到所需的文件并通过API将它们上传到服务器。然后可以通过Java Web Start启动此客户端。
  3. ..你还有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您正在尝试做的事情通常不赞成,因为这正是系统因安装Java而受到损害的原因。您要执行的操作具有特权,您需要以特权模式运行代码,并且很可能创建一个策略文件以允许它在客户端计算机上运行。有关http://www.coderanch.com/how-to/java/HowCanAnAppletReadFilesOnTheLocalFileSystem的简短教程。

现在,拜托,这实际上是一个非常糟糕的想法。您是否有可能无法通过某些API调用编写将执行此上传的JavaScript页面?这样,您就不会绕过浏览器安全性来执行上传。

Java Applet方法是一个过时的,危险的,非常糟糕的讨厌解决方案,没有任何签名,策略文件或调整可以使这个安全。我是一个巨大的Java粉丝,但是如果有一件事让我做噩梦,那就是Java浏览器插件 - 使用它并不是一个很好的理由,而不是当你考虑它是多么不安全时。当然,不要让我开始使用Flash ...

您使用通过Web Start加载的普通Java客户端的想法似乎是最佳解决方案。这样,一旦安装,您的应用程序就可以完全访问底层文件系统。当然,这也开启了关于这是否真的是首先使用Java的情况的争论,但这是另一个鱼的水壶。

答案 1 :(得分:1)

要执行此操作,您必须签署您的小程序。

keytool -genkey -keystore myKeyStore -alias me

keytool -selfcert -keystore myKeyStore -alias me

jarsigner -keystore myKeyStore jarfile.jar me

答案 2 :(得分:0)

使用本地服务器 1 的自签名小程序应该能够访问本地文件系统。 可能是降低Java控制面板中安全级别所必需的。 Oracle正在加强applet的安全性,因此它将取决于加载applet的JRE版本。

  1. 从本地文件系统加载的applet的安全环境似乎比从localhost加载的更安全。有关详细信息,请参阅this answer
  2. 我同意您的评估,即基于JNLP的文件选择器不适合此任务。正如您所提到的,它是用于处理文件资源,而不是目录。更糟糕的是,我注意到我使用基于JNLP的文件打开服务开发的小applet在浏览时抛出NullPointerException,在选择器本身中具有相关的奇怪视觉行为。完全不合适。

    作为applet问题的顶级海报,我强烈警告不要在网页中嵌入上传器。最大的问题是:

    • 它会导致浏览器/ JRE / JavaScript / applet交互错误的进一步问题
    • 它创建了一个不可调整大小的GUI。 创建resizable applet的方式,但上次检查时,它们在浏览器中并不可靠。

    所以最后,我建议使用完全受信任的(即all-permissions)应用。使用Swing JFileChooser或从{J}自由浮动的JNLP JFrame开放的File Browser GUI变体。如果用例足够简单,我们甚至可以省去框架本身,并(直观地)直接进入文件选择器。

    “自由浮动”方法无法在网络应用中使用。这需要JavaScript交互。如果是网络应用程序。需要的是,我们回到“applet”,这就是您希望使用评论中提到的doPrivileged(..)功能的地方。原因是,如果一个方法由JS编程基于Java的安全管理器检测到堆栈中的某些帧不受信任(JS),因此将所有内容放回沙箱中 - 即使Java代码最初是受信任的。