当我在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}libsecurityjava.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)
特别针对modifyThreadGroup
:
Thread
构造函数的API文档指向Thread(ThreadGroup,Runnable,String)
构造函数Thread(ThreadGroup,Runnable,String)
构造函数引用指定的ThreadGroup
上的ThreadGroup.checkAccess
ThreadGroup.checkAccess
被记录为调用SecurityManager.checkAccess(ThreadGroup)
SecurityManager.checkAccess(ThreadGroup)
API文档针对该类中的实现指出:
如果线程组参数不是系统线程组,则方法只是无声地返回。
(然后它建议某种破坏LSP:
想要更严格策略的应用程序应该覆盖此方法。
)
额外的权限是通过普通Java代码添加的。如果你考虑同源政策,这是有必要的。