当我在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
以下是非正式尝试列出限制(由多个用户通过反复试验制作):Restrictions on what an unsigned Java applet can do?
此页面[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";
我就知道必须有一个额外的默认策略文件用于未签名的applet:我创建了一个启动新线程的applet,并且使用上面的默认java.policy
文件,它失败并显示以下内容错误:java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
,表示没有任何内容授予"modifyThreadGroup"
权限。但是,当我在浏览器中运行它时,它会成功创建线程。
所以问题是:当我在浏览器中运行applet时,包含此权限"modifyThreadGroup"
的策略文件在哪里?我在JRE目录中搜索过它,但似乎没有。也许它不是通过文件完成的。然后是什么授予applet "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)
答案 0 :(得分:2)
专门针对modifyThreadGroup
:
Thread
构造函数的API文档指向Thread(ThreadGroup,Runnable,String)
构造函数Thread(ThreadGroup,Runnable,String)
构造函数引用指定ThreadGroup.checkAccess
上的ThreadGroup
ThreadGroup.checkAccess
以致电SecurityManager.checkAccess(ThreadGroup)
SecurityManager.checkAccess(ThreadGroup)
API文档说明了该类中的实现:如果线程组参数不是系统线程组,则为此 方法只是默默地返回。
(然后它暗示破坏LSP:
需要更严格策略的应用程序应覆盖此方法。
)
通过普通的Java代码添加额外的权限。如果您考虑同源政策,这是必要的。