我正在编写一个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应用程序所需的文件。这非常麻烦,因此我们需要自动执行此操作。
我想到了另外两种方法:
答案 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版本。
localhost
加载的更安全。有关详细信息,请参阅this answer。我同意您的评估,即基于JNLP的文件选择器不适合此任务。正如您所提到的,它是用于处理文件资源,而不是目录。更糟糕的是,我注意到我使用基于JNLP的文件打开服务开发的小applet在浏览时抛出NullPointerException
,在选择器本身中具有相关的奇怪视觉行为。完全不合适。
作为applet问题的顶级海报,我强烈警告不要在网页中嵌入上传器。最大的问题是:
所以最后,我建议使用完全受信任的(即all-permissions
)应用。使用Swing JFileChooser
或从{J}自由浮动的JNLP JFrame
开放的File Browser GUI变体。如果用例足够简单,我们甚至可以省去框架本身,并(直观地)直接进入文件选择器。
“自由浮动”方法无法在网络应用中使用。这需要JavaScript交互。如果是网络应用程序。需要的是,我们回到“applet”,这就是您希望使用评论中提到的doPrivileged(..)
功能的地方。原因是,如果一个方法由JS编程,基于Java的安全管理器检测到堆栈中的某些帧不受信任(JS),因此将所有内容放回沙箱中 - 即使Java代码最初是受信任的。