XML 读取器

XML 读取器是 XML 的输入源的游标。 在核心上,XML 读取器一次读取一个 XML 节点,但还有其他帮助程序 API,以便更轻松地读取一系列节点。

支持以下类型的读取器输入:

安全

读取器将验证元素上存在的属性是否唯一。 执行此验证所需的时间是元素上属性数的函数,其大小可以高达 WS_XML_READER_PROPERTY_MAX_ATTRIBUTES。 因此,当 WS_XML_READER_PROPERTY_MAX_ATTRIBUTES 设置为较大值时处理大型文档可能会造成拒绝服务攻击的机会。

读取器会将前缀映射到每个元素和属性的命名空间。 执行此映射所需的时间是范围中 xmlns 属性数的函数,其大小可能高达 WS_XML_READER_PROPERTY_MAX_NAMESPACES。 因此,当此属性设置为较大值时处理大型文档可能会提供拒绝服务攻击的机会。

虽然读者将确保文档遵循 xml 的语法规范,并且其方面在指定的配额内,但当来自不受信任的源时,文档的内容仍必须被视为不受信任。 读取者的用户应使用 WsReadToStartElementWsFindAttribute或手动检查 节点来检查所有元素和属性名称和命名空间。

需要考虑的一些其他情况包括但不限于:

  • 缺少预期元素
  • 可能出现意外的元素
  • 预期属性可能缺失
  • 可能出现意外属性
  • 元素可能显示为空元素
  • 空格可能出现在意外位置

读取者的用户不应仅基于从文档读取的值分配内存。 例如,请考虑以下 xml 文档:

<array count='1000000'>
   <!-- malicious document provider didn't actually provide 1000000 array items -->
</array>

根据假设将遵循一些元素的假设分配数组将是潜在的攻击途径。 在这种情况下,读取者的用户应改为在元素出现时以增量方式分配内存。

XML 读取器不支持 DTD。 读取者的用户不需要关注 DTD 验证。

以下回调用于 XML 读取器:

以下枚举用于 XML 读取器:

以下函数用于 XML 读取器:

以下句柄用于 XML 读取器:

以下结构与 XML 读取器一起使用: