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相关的。
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你提到了一个很重要的问题,即使用配置的 XML 解析器 'DocumentHelper' 可能无法预防和限制文档类型定义 (DTD) 实体解析,从而引发 XXE 注入攻击。这是一种安全漏洞,攻击者可以通过恶意构造的 XML 实体来读取敏感文件、执行远程代码或进行其他恶意操作。 为了防止 XXE 注入攻击,有几个建议和最佳实践可供参考: 1. 禁用外部实体解析:在解析 XML 之前,确保禁用对外部实体的解析。在使用 DocumentHelper 解析,可以通过设置 "setExpandEntityReferences(false)" 来禁用外部实体解析。 2. 使用安全的 XML 解析器:你可以考虑使用更安全的 XML 解析器,如JAXB(Java Architecture for XML Binding)或StAX(Streaming API for XML)。这些解析器具有更严格的默认配置,可以有效地防止 XXE 注入攻击。 3. 白名单验证输入:在接受用户输入并将其作为 XML 数据处理之前,进行严格的输入验证和过滤。确保只接受预期的输入,并且不允许任何外部实体或不受信任的内容进入 XML 数据。 4. 防火墙和入侵检测系统:在网络层面上,使用防火墙和入侵检测系统来检测和阻止恶意的 XML 请求。 5. 更新和升级:及更新和升级你使用的 XML 解析器和相关库,以确保使用的是最新版本,其中包含了已知的安全修复和改进。 请记住,安全性是一个持续的过程,不同的应用场景可能需要针对性的安全措施。因此,综合考虑以上建议,并结合你的具体需求和环境来选择最适合的安全措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值