【问题标题】:Can't get AllPermission configured for intranet applet. Can anyone help?无法为 Intranet 小程序配置 AllPermission。任何人都可以帮忙吗?
【发布时间】:2023-04-07 17:15:01
【问题描述】:

经过大量阅读和测试后,我无法通过 codeBase 授予选项授予 Intranet applet 的所有权限。 此小程序需要完全权限,因为它必须访问 OCR 读取器(也将图像文件写入 HDD)和其他此类外部设备的驱动程序库。

我已经配置了我的 java.policy 文件并添加了以下内容:

grant codebase "@987654321@" { permission java.security.AllPermission; };

在控制台中重新加载策略文件,甚至重新启动浏览器后,我的许多操作都收到 java.security.AccessControlException:access denied,包括读取未被授予的“user.name”系统属性默认。

对于调试,我还尝试了默认授予所有权限并且它有效,所以我的问题基本上与 de codeBase 选项有关。 我正在使用 JRE1.6-u17 运行 Windows 7 和 linux 客户端,它们的行为相同。

谁能帮忙?

提前致谢,

马德拉岛

【问题讨论】:

  • 也许您需要签署小程序以获得所有权限? (甚至带有自生成的证书?)
  • 我已经尝试对小程序进行自签名,但是应该为用户显示的允许小程序在证书下运行的框从未出现。我检查了 jar 文件,元数据中有 RSA 证书。此外,sun 指出,自签名证书可能不会出现证书批准框。因此,我一直在探索更改 java.policy 文件的权限。

标签: java permissions plugins codebase


【解决方案1】:

我不确定我是否正确理解了您的最后评论。正如你所说的两个(对我来说)不同的事情:

  • 您使用 plugin.jar(对我来说这意味着您的 java 调用 javascript 函数)
  • 我从 Javascript 调用相同的函数”(这对我来说意味着你的 javascript 调用 java 函数)

我认为后者是正确的解释。

如果您只是调用 java 方法(通过 liveconnect)而不会做任何与安​​全相关的事情,一切都可以。你可以直接在你的javascript代码中做(假设applet带有id="myapplet"myapplet.safeMethod();

从 javascript 调用 java 方法的主要问题是,这些方法通常只对 applet 进行限制,因为调用似乎在 JVM 中运行在与 applet 本身不同的上下文中。因此被视为非特权代码,您将获得AccessControlException。虽然例如就像在我的另一个答案中一样,由小程序本身执行的方法获得正确的权限并被执行。

现在,如果您在2.8 Security Model of JavaScript-to-Java Calls SUN states 部分阅读此LiveConnect Support in the New Java™ Plug-In Technology

当 JavaScript-to-Java 调用是 制作,JavaScript代码被建模 好像它来自一个 代码来源为的不受信任的小程序 文档库(即, 包含的目录 文件)。

我将其解读为:如果 applet 和 javascript 来自同一个站点,那么 javascript-to-java 调用应该以与 applet 本身相同的权限运行。在我们的例子中,这意味着我们在grant 中设置的任何权利。

但这仅适用于我的 Opera。 FF 和 IE6 都抛出AccessControlException。但它可能仍然适用于所有浏览器。

下面的代码有两个方法userName2()userName()userName2() 所有浏览器中的 WFM。 userName() 仅适用于 Opera。通过按下 html 页面上的按钮进行检查。

如您所见,userName2() 不能像这样用于真正的用例(只能调用一次)。但是您可以在遇到类似问题时查看其他人提出的解决方案,并相应地扩展userName2()

Java Applet using LiveConnect

此外,您可能会考虑一些我没有尝试过的东西。所有来自 javascript-to-java 的调用都不会做任何与安​​全相关的事情,只是(如果需要)传入数据并立即返回。然后小程序执行实际工作(如上面显示的链接中所示)。然后,当完成后,小程序可以通过 JSObject (plugin.jar)

向 html 页面触发回调

TestApp.java

import java.applet.Applet;
import java.awt.*;
import java.security.AccessControlException;

public class TestApp extends Applet {
  Label output = new Label("What is the value of user.name?");
  String userName;
  Thread access = new Thread() {
    @Override
    public void run() {
      try {
        userName = System.getProperty("user.name");
      } catch (AccessControlException e) {
        userName = "Oops, failed in thread. No read permissions!";
      }
    }
  };
  public void init() {
    setLayout(new BorderLayout());
    add(BorderLayout.CENTER, output);
  }
  public String userName2() throws InterruptedException {
    access.start();
    access.join();
    output.setText(userName);
    return userName;
  }
  public String userName() {
    String userName = "Oops, failed in liveconnect-context. No read permissions!";
    try {
      userName = System.getProperty("user.name");
    } catch (AccessControlException e) {
      e.printStackTrace();
    }
    output.setText(userName);
    return userName;
  }
}

test.html

<html><head><title>test</title></head><body>
  <applet id="myapplet" code="TestApp" width="350px" height="80px"></applet><br>
  <input type="button" value="liveconnect version" onclick="javascript:alert(myapplet.userName());"><br>
  <input type="button" value="hacky thread version" onclick="javascript:alert(myapplet.userName2());">
</body></html>

策略:.java.policy(在 C:/Documents and Settings/[USERNAME]/ 中手动创建/注意前导 .

grant codeBase "http://[domain].xxx/-" {
  permission java.util.PropertyPermission "user.name", "read";
};

【讨论】:

  • Jitter,在阅读了您提供的链接后,我想出了使用 AccessController.doPrivileged 来放松堆栈施加的权限限制,它终于可以工作了!再次感谢您提出所有正确的指示并提供帮助。
  • 这很有趣,因为这对我来说根本不起作用。也玩了一下 AccessController 和 PrivilegedAction 但这并没有改变我的任何行为。对你有好处。由于这是一个 Intranet 的东西,您可能很幸运,它也适用于您的所有客户端。
  • 现在考虑支持我的答案,甚至可能接受我付出的所有努力和时间的答案
  • 我接受了你的最后一个回答。我还不能投票,因为我的个人资料上没有 15 个声望点。
【解决方案2】:

现在自己试过了。

  • 类文件 + 位于服务器上的 html 文件 http://[domain].xxx/~someusername/somefolder/
  • 类文件+位于本地文件系统C:/Documents and Settings/[USERNAME]/Desktop/somefolder的html文件

策略:.java.policy(位于 C:/Documents and Settings/[USERNAME]/。注意前导 .

当使用这些小程序时工作并显示[USERNAME]

grant codeBase "file:///-" {
  permission java.util.PropertyPermission "user.name", "read";
};
grant codeBase "http://[domain].xxx/-" {
  permission java.util.PropertyPermission "user.name", "read";
};

然后使用这些(在java控制台中重新加载策略文件)小程序无法显示[USERNAME]

grant codeBase "file:///c/*" {
  permission java.util.PropertyPermission "user.name", "read";
};
grant codeBase "http://[domain].xxx/*" {
  permission java.util.PropertyPermission "user.name", "read";
};

上诉:TestApp.java

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.security.*;

public class TestApp extends Applet {
  Label output = new Label("What is the value of user.name?");
  public void init() {
    Button button = new Button("Click me!");
    setLayout(new BorderLayout());
    add(BorderLayout.NORTH, button);
    add(BorderLayout.CENTER, output);
    button.addActionListener(
      new ActionListener() {
        @Override
        public void actionPerformed( ActionEvent ev ) {
          try {
            output.setText(System.getProperty("user.name"));
          } catch (AccessControlException e) {
            output.setText("Oops, failed. No read permissions");
          }
        }
      }
    );
  }
}

HTML:index.html

<html><body>
  <applet code="TestApp.class" width=350 height=80></applet>
</body></html>

我现在有点困惑。您声明上述grant 声明不起作用,同时声明“默认授予所有权限......有效”?

几个问题

  • 您使用的是什么浏览器?
  • 你编辑了哪个 java.policy 文件/你把它放在哪里
  • URL 到底是什么样的? myIntranetServer 是否可以通过 DNS 解析?如果不是,java 应用规则可能有问题

【讨论】:

  • 是的。如果我的权限为 grant{ 权限 java.security.AllPermission; };它工作正常。如果我应用代码库,它不会。我已经尝试使用简单的机器名称和完整的机器名称(带有域的机器名称)以及各种大小写组合对问题进行暴力攻击,因为我在另一个论坛上读到 codeBase 是区分大小写的。事实上似乎没有任何效果。
  • 我同时使用 IE8 和 Firefox。策略文件是正确的,因为我可以在更改它时获得不同的行为。就像我上面所说的,我正在为 myIntranetServer 尝试几种可能性: {servername, servername.domainname.pt} 以及相同值的一些组合会改变字母的大小写。感谢您的关注。
  • 我唯一知道的与区分大小写有关的是,codeBase 应该全部小写,除了 B.codeBase
  • 现在自己做了一个快速测试。查看答案了解详情
  • 是的,这就是我编写 codeBase 属性的方式。我提到的案例问题适用于属性的内容,即路径本身。我一直在检查您的快速测试,一切似乎都与我所拥有的一样,尽管我没有找到您所指的 .java.policy 文件。我直接使用 $JAVA_HOME\lib\security\java.policy ,当我更改它并在控制台中重新加载它时,我确实看到了行为的变化。
猜你喜欢
  • 2011-07-10
  • 1970-01-01
  • 2015-05-09
  • 2010-10-10
  • 2021-06-24
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 2012-10-28
相关资源
最近更新 更多