setFeature的妙用,解析XML时,外部注入预防即XXE攻击
2015-12-29 08:35
495 查看
SAX2采用feature和property这两种办法对解析器进行设置。SAX不但没有限制feature的种类,还鼓励其他组织和个人创建自己的feature。这些feature表示解析器的功能,通过设置feature,我们可以控制解析器的行为,例如,是否对XML文件进行验证等等。下面我们演示如何使用feature。XMLReader中有getFeature和setFeature两个方法。getFeature方法可以用来探测解析器是否打开或具有某些功能,这个方法的返回值为boolean型数据。setFeature可以进行设置,打开或者关闭某些功能,参数有两个,第一个为一个URI字符串,表示功能类型,第二个为一个boolean型数据,表示是否打开,关闭某个功能。下面一段代码演示了如何使用getFeature。
setFeature方法可以把一个特性设置为true或者false,从而打开或者关闭这个特性。下面的代码演示了如何使用setFeature。
表4中列出了SAX和APACHE提供的所有feature:
try{if (xmlReader.getFeature("http://xml.org/sax/features/validation")) {System.out.println("Parser is validating."); } else { System.out.println("Parser is not validating."); } } catch (SAXException e) { System.out.println("Parser may or may not be validating."); }
setFeature方法可以把一个特性设置为true或者false,从而打开或者关闭这个特性。下面的代码演示了如何使用setFeature。
try{XMLReader oXReader = XMLReaderFactory.createXMLReader();oXReader.setFeature("http://xml.org/sax/features/namespaces",true);}catch(...){ ... }
表4中列出了SAX和APACHE提供的所有feature:
feature | 功能 |
http://xml.org/sax/features/namespaces | 打开、关闭名空间处理功能。当正在解析文档时为只读属性,未解析文档的状态下为读写。 |
http://xml.org/sax/features/namespace-prefixes | 报告、不报告名空间前缀。当正在解析文档时为只读属性,未解析文档的状态下为读写。 |
http://xml.org/sax/features/string-interning | 是否将所有的名字等字符串内部化,即使用String.intern()方法处理所有的名字字符串,Xerces目前不支持这个特性,在支持这种特性的解析器上这样可以节省内存空间,但是可能会稍微降低速度。在处理有很多的重复tag的时候打开这个特性可以节约很多空间;由于节省了重新分配内存的时间,反而可能会提高速度。当正在解析文档时为只读属性,未解析文档的状态下为读写。 |
http://xml.org/sax/features/validation | 是否打开校验。当关闭校验的时候可以大大节约内存空间并且大大提高解析速度。因此如果使用的XML文档是可靠的,例如程序生成的,最好关闭校验。当正在解析文档时为只读属性,未解析文档的状态下为读写。 |
http://xml.org/sax/features/external-general-entities | 是否包含外部生成的实体。当正在解析文档时为只读属性,未解析文档的状态下为读写。 |
http://xml.org/sax/features/external-parameter-entities | 是否包含外部的参数,包括外部DTD子集。当正在解析文档时为只读属性,未解析文档的状态下为读写。 |
http://apache.org/xml/features/validation/schema | 是否使用schema。这个特性是apache为Xerces提供的。 |
http://apache.org/xml/features/validation/dynamic | 当设置为true时,仅仅在XML文档指明语法时进行校验,若设置为false,则由http://xml.org/sax/features/validation决定,若其为false则不校验,若为true则校验。 |
http://apache.org/xml/features/validation/warn-on-duplicate-attdef | 是否在遇到重复的属性声明时警告。 |
http://apache.org/xml/features/validation/warn-on-undeclared-elemdef | 是否在遇到未定义的元素的时候警告。 |
http://apache.org/xml/features/allow-java-encodings | 是否允许在XMLDecl和TextDecl使用java的字符编码名。如果设置为false则在遇到java字符编码名的时候会产生一个错误。需要注意的是不是所有的解析器都会允许使用java字符编码名的。 |
http://apache.org/xml/features/continue-after-fatal-error | 是否在发生致命错误后继续进行解析。 |
http://apache.org/xml/features/nonvalidating/load-dtd-grammar | 是否装载DTD语法并且自动增添DTD中定义的缺省值。若http://xml.org/sax/features/validation设置为true则此特性自动设置为true。 |
http://apache.org/xml/features/dom/defer-node-expansion | 这个特性是DOM特性,在这里一起介绍了。是否使用懒惰型节点展开,当这个特性设置为true时,可以提高解析速度并节约内存。这个特性同属性http://apache.org/xml/properties/dom/document-class-name的设置有关。 |
http://apache.org/xml/features/dom/create-entity-ref-nodes | 这个特性是DOM特性,是否用引用的方式建立实体节点,若设置为true则会建立EntityReference节点,若设置为false则会用实际字符串取代实体引用。 |
http://apache.org/xml/features/dom/include-ignorable-whitespace | 这个特性是DOM特性,是否将可以忽略的空白字符串包含在DOM树里面,缺省为true。但是笔者本人一般情况下会设置为false。另外仅仅在打开了校验的情况下才可以判断出来是否有空白字符串。因此这个特性是同http://xml.org/sax/features/validation相关的。 |
相关文章推荐
- Android中 xml 的解析
- QT中使用QXmlStreamReader解析XML文件
- 解析带有命名空间xmlns的xml文件 (XML解析中的namespace初探)
- xml解析
- Android XML 解析
- 解析XML—— Dom4j的SAX解析
- java SAX解析分析
- pull解析器解析xml
- Android学习笔记 day02 _ 测试 & 文件读写操作
- XML解析
- 只需要一步即可将xml数据转化成自定义类的对象模型
- 欢迎使用CSDN-markdown编辑器
- XML解析之SAX解析
- XML解析之Jdom解析
- XML解析之dom4j解析
- SAXReader saxReader = new SAXReader();来解析xml文件
- java解析xml的4种经典方法
- android解析xml文件的3种方式
- Java解析XML的四种方法
- XML解析器