如何在 XMLReaderFactory 中设置 FEATURE_SECURE_PROCESSING?
Posted
技术标签:
【中文标题】如何在 XMLReaderFactory 中设置 FEATURE_SECURE_PROCESSING?【英文标题】:How to set FEATURE_SECURE_PROCESSING in XMLReaderFactory? 【发布时间】:2014-06-07 21:35:58 【问题描述】:我正在使用 Piccolo jar 并使用 XMLReaderFactory 创建 XML 阅读器。 我需要设置安全处理功能,因此我这样做了,
xmlReader = XMLReaderFactory.createXMLReader("com.bluecast.xml.Piccolo");
xmlReader.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
但这是抛出错误
org.xml.sax.SAXNotRecognizedException: http://javax.xml.XMLConstants/feature/secure-processing
at com.bluecast.xml.Piccolo.setFeature(Piccolo.java:937)
我有一个旧的 xercesImpl.jar,它已被 xercesImpl-2.9.1.jar 取代,但仍然出现相同的错误。我用谷歌搜索并没有找到任何具体的解决方案。
请帮忙,任何想法都是可以理解的。
【问题讨论】:
【参考方案1】:所以常量XMLConstants.FEATURE_SECURE_PROCESSING
的值是http://javax.xml.XMLConstants/feature/secure-processing
根据源代码here(最新的是1.04),一个大的if else块检查看看这个值是否是允许的特性之一,如果不是抛出这个异常。而且事实上,它不是被判断为合法的值之一,因此会抛出异常。
根据SaxParserFactory,我们阅读
所有实现都需要支持 javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING 功能。
Piccolo 实现了 Parser 而不是 SaxParser。所以总而言之,我会说 Piccolo 不支持该功能。也许我会说使用不同的支持它的 XMLReader。
【讨论】:
【参考方案2】:用于 SAX2 的 Oracle JDK 内部 Xerces 版本的 XMLReaderFactory 足够有趣,也没有提供此功能设置器。我不确定是什么,或者推荐的替代方案应该是什么。有这样的解决方法:
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
XMLReader reader = spf.newSAXParser().getXMLReader();
奇怪。在内部,它映射到具有不同实体扩展限制的 security-manager (com.sun.org.apache.xerces.internal.utils.XMLSecurityManager)。此外,它将新属性 XMLConstants.ACCESS_EXTERNAL_DTD
和 XMLConstants.ACCESS_EXTERNAL_SCHEMA
设置为 ""
(无外部访问权限)。
【讨论】:
以上是关于如何在 XMLReaderFactory 中设置 FEATURE_SECURE_PROCESSING?的主要内容,如果未能解决你的问题,请参考以下文章