使用属性

本节重点介绍 JAXP 1.5 中引入的新属性。

何时使用属性

仅当应用程序处理不受信任的 XML 内容时才需要限制获取外部资源。不处理不受信任内容的内部系统和应用程序无需担心新限制或进行任何更改。由于默认情况下 7u40 和 JDK8 对此类限制没有要求,因此在升级到 7u40 和 JDK8 时,应用程序不会发生任何行为更改。

对于确实处理不受信任的 XMLImporting,Pattern 或样式表的应用程序,如果已经存在现有的安全措施,例如使 Java Security Manager 仅授予受信任的外部连接或使用解析器解析实体,则不需要新功能。在 JAXP 1.5 中添加。

但是,JAXP 1.5 确实为没有安全 管理 器的系统和应用程序提供了直接保护。对于此类应用,可以通过使用以下详细介绍的新功能来考虑限制。

通过 API 设置属性

当更改代码可行时,通过 JAXP 工厂或解析器设置新属性是启用限制的最佳方法。可以通过以下interface设置属性:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setAttribute(name, value);
 
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = spf.newSAXParser();
parser.setProperty(name, value);
 
XMLInputFactory xif = XMLInputFactory.newInstance();
xif.setProperty(name, value);
 
SchemaFactory schemaFactory = SchemaFactory.newInstance(schemaLanguage);
schemaFactory.setProperty(name, value);
 
TransformerFactory factory = TransformerFactory.newInstance();
factory.setAttribute(name, value);

以下是将 DOM 解析器限制为仅用于外部 DTD 的本地连接的示例:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
    dbf.setAttribute({{XMLConstants.ACCESS_EXTERNAL_DTD}}, "file, jar:file");
} catch (IllegalArgumentException e) {
    //jaxp 1.5 feature not supported
}

如果可以更改代码,并且要进行新开发,建议如上所述设置新属性。通过以这种方式设置属性,无论将应用程序部署到 JDK 的较早版本还是较新版本,或者通过系统属性或jaxp\.properties设置属性,都可以确保应用程序维持所需的行为。

使用系统属性

如果更改代码不可行,则系统属性可能很有用。

如果希望为整个 JDK/JRE 调用设置限制,请在命令行上设置系统属性;否则,请参见图 4.如果仅一部分应用程序需要它,则可以在该部分之前设置系统属性,然后再清除。例如,以下代码显示了如何使用系统属性:

//allow resolution of external schemas

System.setProperty("javax.xml.accessExternalSchema", "file, http");

//this setting will affect all processing after it's set
some processing here

//after it's done, clear the property
System.clearProperty("javax.xml.accessExternalSchema");

Using jaxp.properties

jaxp\.properties是纯配置文件。它位于$\{java\.home\}/lib/jaxp\.properties,其中java\.home是 JRE 安装目录,例如\[path to installation directory\]/jdk7/jre

可以通过将以下行添加到 jaxp.properties 文件中来设置外部访问限制:

javax.xml.accessExternalStylesheet=file, http

设置此选项后,JDK/JRE 的所有调用都将遵守有关加载外部样式表的限制。

对于不想通过 XML 处理器进行任何外部连接的系统,此功能可能很有用,在这种情况下,所有三个属性都可以设置为仅文件。