setFeature的妙用,解析XML时,外部注入预防即XXE攻击

SAX2采用feature和property这两种办法对解析器进行设置。SAX不但没有限制feature的种类,还鼓励其他组织和个人创建自己的feature。这些feature表示解析器的功能,通过设置feature,我们可以控制解析器的行为,例如,是否对XML文件进行验证等等。下面我们演示如何使用feature。XMLReader中有getFeature和setFeature两个方法。getFeature方法可以用来探测解析器是否打开或具有某些功能,这个方法的返回值为boolean型数据。setFeature可以进行设置,打开或者关闭某些功能,参数有两个,第一个为一个URI字符串,表示功能类型,第二个为一个boolean型数据,表示是否打开,关闭某个功能。下面一段代码演示了如何使用getFeature。

 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相关的。

你可能感兴趣的:(Java,xml解析,外部注入攻击,XXE攻击)