【问题标题】:How can I get a signed Java Applet to perform privileged operations when called from unsigned Javascript?从未签名的 Javascript 调用时,如何获得已签名的 Java Applet 以执行特权操作?
【发布时间】:2010-11-03 15:34:05
【问题描述】:

签名的 Java 小程序与客户端上运行的普通 Java 应用程序具有相同的安全权限。对于特定项目,我需要这些权限,并且我需要通过 JavaScript 调用来执行特权操作。

现在,问题是,至少对于 Ubuntu 中的 Firefox 3(目标浏览器和平台),当通过未签名的 JavaScript 调用小程序方法时,它会失去其特殊权限。由于无法选择对 JavaScript 进行签名,因此我需要一种方法来解决此限制。

实现此目的的一种方法是在小程序启动时创建一个线程,并在主线程接收到 JavaScript 调用时调用该线程上的方法。我已经实现了这个想法的工作原型,但我发现它有点笨拙,因为它使用了太多反射并且不像我想要的那样容易重用。

是否有一种通用的标准方法来做我想做的事情?而且,如果我的想法是正确的方法,您将如何以可重用的方式实现它?我想要实现的是一个框架,它允许将这种“在特权线程中运行的方法”的东西用于各种对象。理想的乌托邦解决方案是这样的:

// when the applet starts-up
PrivilegedExecuter priv = new PrivilegedExecuter(myObject); //or MyClass.class
// ...
// inside a JavaScript-called method (myObject has myMethod)
priv.myMethod(); // myMethod is run synchronously in a privileged thread

【问题讨论】:

    标签: java javascript security applet


    【解决方案1】:

    使用 java.security.AccessController 类。

    有一个 doPrivilegedAction 和 doPrivilegedExceptionAction 可以完全满足您的需求。

    例如:

    AccessController.doPrivileged(new PrivilegedAction() { 公共对象运行(){ ..做一些只适用于签名小程序的事情.. } });

    【讨论】:

      【解决方案2】:

      值得补充的是:使您的 privaction'd run() 方法尽可能小且独立。显然,您可以让已签名的小程序的 init() 方法调用特权 run(),而后者又执行实际的小程序,但这只是乞求被滥用、意外误用或彻底利用。

      此外,签名的小程序在被 JavaScript 调用时会失去其特殊权限这一事实并不特定于特定的浏览器或平台。无论何时何地,都是如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 2016-07-23
        相关资源
        最近更新 更多