适用于未签名applet的默认Java策略文件在哪里?

时间:2012-11-23 12:10:56

标签: java applet

当我在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)

1 个答案:

答案 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代码添加额外的权限。如果您考虑同源政策,这是必要的。