0

当我在 Web 浏览器中运行未签名的 Java 小程序时,它可以做一些事情而不是其他事情。必须有一个文件来定义这个。我认为它可能看起来像这里的列表 [ http://www.coderanch.com/t/460650/Websphere/java-security-AccessControlException-Access-denied ] 并包含如下条目:

permission java.lang.RuntimePermission "getClassLoader"; 
permission java.lang.RuntimePermission "setFactory"; 
permission java.lang.RuntimePermission "accessClassInPackage.sun.misc"; 
permission java.lang.RuntimePermission "accessClassInPackage.sun.beans.infos"; 
permission java.lang.RuntimePermission "accessDeclaredMembers"; 
permission java.net.SocketPermission "*", "accept, resolve, connect"; 
permission java.util.PropertyPermission "*", "read, write"; 
permission java.security.SecurityPermission "printIdentity"; 
permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; 
permission java.lang.RuntimePermission "modifyThread"; 
permission java.lang.RuntimePermission "modifyThreadGroup"; 
permission java.security.SecurityPermission "getProperty.ssl.SocketFactory.provider"; 

permission java.lang.RuntimePermission "createClassLoader"; 
permission java.lang.RuntimePermission "getProtectionDomain"; 

以下是它可能包含的更多条目的列表:http: //download.java.net/jdk8/docs/technotes/guides/security/permissions.html

这是列出限制的非正式尝试(似乎是由多个用户通过反复试验做出的):对未签名 Java 小程序可以做什么的限制?

此页面 [ http://docs.oracle.com/javase/1.3/docs/guide/security/PolicyFiles.html ] 似乎暗示唯一相关的两个文件是${java.home}\lib\security\java.policy${user.home}\.java.policy。我有一个默认安装,我没有后一个文件,只有前者。该文件仅包含

permission java.lang.RuntimePermission "stopThread";

以及各种PropertyPermission

permission java.util.PropertyPermission "java.version", "read";

这就是我知道必须有一个额外的未签名小程序的默认策略文件的方式:我制作了一个启动新线程的小程序,并且使用java.policy上面的默认文件,它失败并出现以下错误:java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup"),表明没有授予任何内容它的"modifyThreadGroup"许可。但是,当我在浏览器中运行它时,它会成功创建线程。

所以问题是:当我在浏览器中运行小程序时,包含此权限的策略文件在哪里"modifyThreadGroup"?我在 JRE 目录中搜索过,但似乎没有。也许它不是通过文件完成的。那么是什么授予小程序"modifyThreadGroup"权限(和其他权限)?

编辑

这是我看到的异常的堆栈跟踪:

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
    at java.security.AccessController.checkPermission(AccessController.java:555)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at sun.applet.AppletSecurity.checkAccess(AppletSecurity.java:252)
    at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
    at java.lang.Thread.init(Thread.java:376)
    at java.lang.Thread.<init>(Thread.java:446)
    at LITSApplet.init(LITSApplet.java:30)
    at sun.applet.AppletPanel.run(AppletPanel.java:434)
    at java.lang.Thread.run(Thread.java:722)
4

1 回答 1

2

专门用于modifyThreadGroup

  • 构造函数的 API 文档Thread指向Thread(ThreadGroup,Runnable,String)构造函数
  • Thread(ThreadGroup,Runnable,String)构造函数指的是在ThreadGroup.checkAccess指定的ThreadGroup
  • ThreadGroup.checkAccess记录在案以调用SecurityManager.checkAccess(ThreadGroup)
  • SecurityManager.checkAccess(ThreadGroup)API 文档说明了该类中的实现:

如果线程组参数不是系统线程组,则此方法只是静默返回。

(然后它暗示了一种破坏 LSP:

需要更严格策略的应用程序应覆盖此方法。

)

额外的权限是通过普通的 Java 代码添加的。如果您考虑同源策略,这是有必要的。

于 2012-11-23T12:40:53.040 回答