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 读取器: