代码之家  ›  专栏  ›  技术社区  ›  Eddie

accesscontroller.doprivileged是否为javascript线程授予已签名小程序的权限?

  •  11
  • Eddie  · 技术社区  · 14 年前

    我在看一个签名的applet,它是从javascript中调用的。显然,源于JavaScript的线程比直接从Java内部启动的任何线程更为沙箱化。例如,如果一个javascript线程调用小程序并记录一些导致日志文件滚动的内容,则会引发安全异常。直接在小程序中启动的任何线程都不会遇到此安全异常。这里使用log4j的解决方案是使用异步附加器。

    但是,除了其他安全例外(例如,在已签名的小程序中使用Apache轴,但在JavaScript线程中),没有明显的方法可以拥有一些异步线程。假设我有下面的代码,如果从Java线程调用的话,如果通过JavaScript调用,SurvivExchange会失败:

    public void someMethodCalledFromJavaScript() {
      // Stuff that would throw a SecurityException
    }
    

    我看到以下三个选项,但它们可能并不都有效。为了讨论这个问题,忽略执行是否是同步的还是异步的,因为这很容易管理。我很难理解安全模型的细节。以下是我的三个潜在选择:

    • 启动一个新线程(这个线程还能工作吗?):

      public void someMethodCalledFromJavaScript() {
        new Thread(new Runnable() {
          public void run() {
            // Stuff that would throw a SecurityException
          }
        }).start();
      }
      
    • 让小程序随时准备好一个线程,通过javascript源线程触发(这里是高度简化的代码):

      private volatile boolean doit = false;
      
      // This code is running in a Thread, started @ Applet init time
      public void alwaysWaiting() {
        while (true) {
          if (doit) {
            doit = false;
            // Stuff that would throw a SecurityException
          }
        }
      }
      
      public void someMethodCalledFromJavaScript() {
        doit = true;
      }
      
    • 使用accesscontroller.doprivileged:

      public void someMethodCalledFromJavaScript() {
        AccessController.doPrivileged(new PrivilegedAction() {
          public Object run() {
            // Stuff that would throw a SecurityException
            return null;
          }
        });
      }
      

    根据我读到的 AccessController.doPrivileged ,您将运行当前安全特权与所调用代码的安全域的特权的交叉点。这对我来说没有意义,就好像你和 交叉 对于低安全域和高安全域,您只需要拥有低安全域。很明显我不明白什么。

    具体 SecurityException 我看到的是这个:

    java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers)
    

    当然,我很好奇在javascript调用签名小程序的上下文中的一般情况,以及如何允许由javascript发起的线程与签名小程序的priv一起运行,就好像它是一个纯由小程序发起的线程一样。

    上面的哪些选择甚至有效,哪些比其他选择更好,以及原因。

    2 回复  |  直到 14 年前
        1
  •  11
  •   L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳    14 年前
    • “启动一个新线程(这个线程还能工作吗?”

    因为下面提到的原因不能工作

    • 让小程序随时准备好一个线程,通过javascript源线程触发。

    当然行,但那比打电话更痛苦 doPrivileged 但在语义上效果相同。

    • 使用accesscontroller.doprivileged

    是的,这会奏效的。

    每次访问控制检查都会检查当前线程堆栈上的所有堆栈帧集(包括递归地引导到当前线程实例化的堆栈帧)。如果有 多刺的 帧,指向该帧的帧不包括在集合中(但实际 多刺的 框架 包括在内)。

    如果要检查的特权不在该集中的每个帧中,则检查失败。

    换句话说,一个线程的当前特权是这个集合中特权的交集。

    例如,如果特权代码 多刺的 一些非特权代码试图打开一个文件,检查将失败。同样,如果非特权代码 多刺的 打开文件的特权代码,检查将失败。但是,如果非特权代码调用特权代码,特权代码反过来调用 多刺的 若要打开文件,检查将成功。

    理论上,你 应该 只能够授予Java代码库所需的特权(可能访问一些隔离的目录),然后授予 相同的 对将使用此特权代码的javascript代码的特权,但我怀疑任何浏览器都具有此类功能。我很惊讶JavaScript甚至在Java的另一个保护域中运行。

    我从来没有做过JavaScript & lt;-& gt;Java互操作,但是不管你要用JavaScript调用的方法看起来都是什么样的。 多刺的 整个身体上都有积木。


    编辑:正如萨米所说,be 仔细的 调用时 多刺的 在特权代码中阻塞(并读取他的答案)。

        2
  •  10
  •   Sami Koivu    14 年前

    我会和那个瘾君子一起去。请注意,每个有权访问您的小程序的人都可以下载它并将其放到他们的网站上,并让他们自己的恶意javascript以您无法想象的方式调用它。

    其他解决方案的安全含义基本相同(编辑:尽管创建新线程不起作用,正如Longpoke指出的那样),但它们更复杂。所以我看不出他们有什么优势。

    doPrivileged只考虑直接调用方的保护域。在您的示例中,定义了方法somemethodfromjavascript的类。如果这是签名jar中的可信类,那么不可信的javascript调用它并不重要。