不允许实体声明但允许 DTD
Disallow entity declarations but allow DTDs
我得到了一份 XML 文档,该文档必须允许具有文档类型声明 (DTD),但我们禁止任何 ENTITY 声明。
XML文档用SAXParser.parse()
解析,如下:
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
factory.setValidating(true);
SAXParser parser = factory.newSAXParser();
然后 XML 作为 InputSource
:
传递给解析器
InputSource inputSource= ... ;
parser.parse(inputSource, handler);
并且 handler
有一个 resolveEntity
方法,SAXParser.parse()
调用:
public InputSource resolveEntity(String pubID, String sysID) throws SAXException {
InputSource inputSource = null;
try {
inputSource = entityResolver.resolveEntity(publicId, systemId);
}
catch (IOException e) {
throw new SAXException(e);
}
return inputSource;
}
当我传入带有 ENTITY 引用的 XML 文件时,似乎没有对禁止的 ENTITY 引用执行任何操作 - 没有抛出异常也没有删除任何内容。
这是我正在使用的错误 XML 的示例。应该允许 DTD,但不允许使用 !ENTITY 行:
<!DOCTYPE foo SYSTEM "foo.dtd" [
<!ENTITY gotcha SYSTEM "file:///gotcha.txt"> <!-- This is disallowed-->
]>
<label>&gotcha;</label>
我需要做什么才能确保在 XML 中不允许使用 ENTITY 引用,但仍然允许使用 DTD?
在 SaxParser 上设置 org.xml.sax.ext.DeclHandler
。
parser.setProperty("http://xml.org/sax/properties/declaration-handler", myDeclHandler);
当解析内部实体声明时,DeclHandler 会收到通知。要禁止实体声明,您可以简单地抛出 SAXException:
public class MyDeclHandler extends org.xml.sax.ext.DefaultHandler2 {
public void internalEntityDecl(String name, String value) throws SAXException {
throw new SAXException("not allowed");
}
}
我得到了一份 XML 文档,该文档必须允许具有文档类型声明 (DTD),但我们禁止任何 ENTITY 声明。
XML文档用SAXParser.parse()
解析,如下:
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
factory.setValidating(true);
SAXParser parser = factory.newSAXParser();
然后 XML 作为 InputSource
:
InputSource inputSource= ... ;
parser.parse(inputSource, handler);
并且 handler
有一个 resolveEntity
方法,SAXParser.parse()
调用:
public InputSource resolveEntity(String pubID, String sysID) throws SAXException {
InputSource inputSource = null;
try {
inputSource = entityResolver.resolveEntity(publicId, systemId);
}
catch (IOException e) {
throw new SAXException(e);
}
return inputSource;
}
当我传入带有 ENTITY 引用的 XML 文件时,似乎没有对禁止的 ENTITY 引用执行任何操作 - 没有抛出异常也没有删除任何内容。
这是我正在使用的错误 XML 的示例。应该允许 DTD,但不允许使用 !ENTITY 行:
<!DOCTYPE foo SYSTEM "foo.dtd" [
<!ENTITY gotcha SYSTEM "file:///gotcha.txt"> <!-- This is disallowed-->
]>
<label>&gotcha;</label>
我需要做什么才能确保在 XML 中不允许使用 ENTITY 引用,但仍然允许使用 DTD?
在 SaxParser 上设置 org.xml.sax.ext.DeclHandler
。
parser.setProperty("http://xml.org/sax/properties/declaration-handler", myDeclHandler);
当解析内部实体声明时,DeclHandler 会收到通知。要禁止实体声明,您可以简单地抛出 SAXException:
public class MyDeclHandler extends org.xml.sax.ext.DefaultHandler2 {
public void internalEntityDecl(String name, String value) throws SAXException {
throw new SAXException("not allowed");
}
}