使用外部文档()执行XSLT时签名的Applet抛出AccessControlException

时间:2011-10-25 06:46:34

标签: debugging xslt applet code-signing accesscontrolexception

我想获得有关已签名的applet + XSL转换的帮助

我有一个签名的小程序(带有1个JAR文件),它执行XSL转换,其中输入XML,XSL和输出在本地文件系统上读/写。 我已经用JRE试过了

  • 1.5.0_22
  • 1.6.0_29
  • 1.7.0_01

,结果是一样的:

当我的XSL文件包含对外部XML文档的引用时:

<xsl:variable name="extXML" select="document('/tmp/A.XML')"/>
<xsl:value-of select="$extXML/Child"/>

转型失败:

com.sun.org.apache.xalan.internal.xsltc.TransletException: java.security.AccessControlException: access denied (java.io.FilePermission /tmp/A.XML read)
at com.sun.org.apache.xalan.internal.xsltc.dom.LoadDocument.documentF(LoadDocument.java:142)
at in.topLevel()
at in.transform()
at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:603)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:709)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)
at myxsltapplet.MyXSLTApplet.xsltTransform(MyXSLTApplet.java:66)

如果对外部XML文档的引用被注释掉,一切正常。 使用策略文件解决了这个问题,但不幸的是,这不是一个选项。

我已经为URIResolver实现了TransformerFactory,但我也在其中获得了AccessControlException。

在applet中我检索了SecurityManager及其AccessControlContext并注销了他们的哈希码:

SecurityManager: sun.plugin2.applet.Applet2SecurityManager@103fcaa
getSecurityContext(): java.security.AccessControlContext@17b2b2

我在URIResolver实现中做了同样的事情,并且AccessControlContext已经改变了:

SecurityManager: sun.plugin2.applet.Applet2SecurityManager@103fcaa
getSecurityContext(): java.security.AccessControlContext@ede64c

在原始AccessControlContext上调用checkPermission无例外地运行。

在我的URIResolver中可访问的新AccessControlContext上调用checkPermission:

AccessControlContext acc = (AccessControlContext) System.getSecurityManager().getSecurityContext();
acc.checkPermission(new FilePermission("/tmp/A.XML", "read"));

抛出:

ERROR: 'java.security.AccessControlException: access denied (java.io.FilePermission /tmp/A.XML read)'

这是正常的事情还是一个错误? 谢谢你的任何想法,

1 个答案:

答案 0 :(得分:0)

通常会阻止在浏览器中运行的软件访问本地文件。以下是对原因的一些解释: