0

我想获得有关签名小程序 + 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 文档的引用被注释掉,一切都会正常工作。使用策略文件可以解决这个问题,但不幸的是,这不是一个选项。

我已经实现了一个为TransformerFactory设置的URIResolver ,但我也得到了 AccessControlException。

在小程序中,我检索了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)'

这是正常现象还是错误?感谢您的任何想法,

4

1 回答 1

0

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

于 2013-10-11T17:45:51.870 回答