首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AccessController.doPrivileged是否授予JavaScript线程签名小程序的权限?

AccessController.doPrivileged是否授予JavaScript线程签名小程序的权限?
EN

Stack Overflow用户
提问于 2010-09-03 00:39:30
回答 2查看 6.4K关注 0票数 11

我正在看一个由JavaScript大量调用的签名小程序。显然,来自JavaScript的线程比任何直接从Java内部启动的线程的沙箱都要重。例如,如果JavaScript线程调用Applet并记录导致日志文件滚动的内容,则会引发安全异常。在Applet中直接启动的任何线程都不会遇到此安全异常。使用log4j的解决方案是使用异步附录。

但是,除了其他安全异常(例如,在签名的Applet中使用Apache,但在JavaScript线程中),没有明显的方法可以拥有一些异步线程。假设我有以下代码,如果从Java线程调用这些代码,那么如果通过JavaScript调用,SecurityException就会失败:

代码语言:javascript
复制
public void someMethodCalledFromJavaScript() {
  // Stuff that would throw a SecurityException
}

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

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

public void someMethodCalledFromJavaScript() { new (new(){ public void (){public void(),将抛出SecurityException } }).start();}

  • 使Applet随时准备就绪,通过JavaScript源文件线程(这里高度简化的代码)触发线程:

私有易失布尔值doit = false;//此代码运行在线程中,已启动@ Applet time public void alwaysWaiting() {而(true) { if ( doit ) { doit = false;//将抛出SecurityException }}公钥someMethodCalledFromJavaScript() {doit= true;}

  • 使用AccessController.doPrivileged:

公共空someMethodCalledFromJavaScript() {AccessController.doPrivileged(新的PrivilegedAction() ){公共对象运行(){ //将引发SecurityException返回null;};}

根据我所读到的关于AccessController.doPrivileged的内容,您运行的是当前安全特权和您正在调用的代码的安全域的特权的交集。这对我来说没有任何意义,就好像你在运行一个低安全域和一个高安全域的交集一样,你只会有一个低安全域。所以很明显我不明白什么。

我看到的具体的SecurityException是这个:

代码语言:javascript
复制
java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers)

但是,我当然很好奇在JavaScript调用到一个签名的Applet的上下文中的一般情况,以及如何允许JavaScript起源的线程与签名Applet的priv一起运行,就好像它是一个纯粹起源于Applet的线程一样。

上面的选择甚至会奏效,哪些比其他的更好,以及为什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-03 15:28:42

  • “启动一条新线程(这一条是否有效?)”

由于下面提到的原因,无法工作

  • 让Applet有一个随时可以运行的线程,这是通过JavaScript源线程

触发的。

当然可以,但这比调用doPrivileged更痛苦,但在语义上也有相同的效果。

AccessController.doPrivileged使用

是的,这样就行了。

每个访问控制检查检查当前线程堆栈上的所有堆栈帧集(包括导致当前线程实例化的堆栈帧)。如果有一个doPrivileged帧,直到该帧的帧不包括在集合中(但包括实际的doPrivileged帧)。

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

换句话说,线程的当前权限是该集合中权限的交集。

因此,例如,如果特权代码doPrivileged是一些试图打开文件的非特权代码,则检查将失败。同样,如果非特权代码doPrivileged的特权代码打开文件,则检查将失败。但是,如果非特权代码调用特权代码,而特权代码反过来调用doPrivileged来打开文件,则检查将成功。

理论上,您应该只能授予您的Java代码所需的特权(可能是访问某个孤立的目录),然后将相同的权限授予将使用该特权代码的JavaScript代码,但我怀疑任何浏览器都有这样的特性。我感到惊讶的是,JavaScript甚至在另一个保护域中运行,而不是Java。

我从来没有做过JavaScript <->JavaScript,但是不管您要做什么,JavaScript调用的方法都会在它们的整个身体上使用doPrivileged块。

编辑:正如Sami所说,在特权代码中调用doPrivileged块时要小心(并阅读他的答案)。

票数 11
EN

Stack Overflow用户

发布于 2010-09-03 02:07:59

我会和doPrivileged一起去。请注意,每个访问您的applet的人都可以下载它,并将其放在自己的站点上,并以您想象不到的方式调用它们自己的恶意javascript。

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

AccessController.doPrivileged只考虑直接调用方的保护域。在您的示例中,定义方法someMethodCalledFromJavaScript的类。如果这是签名jar中的一个可信类,那么不受信任的Javascript调用它并不重要。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3632283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档