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 的语法规范,而且其方面在指定的配额范围内,但来自不受信任的源时,文档内容仍必须被视为不受信任。 读取器的用户应使用 WsReadToStartElement、WsFindAttribute 或通过手动检查节点来检查所有元素和属性名称和命名空间。
要考虑的其他一些情况包括但不限于:
- 可能缺少预期的元素
- 可能会出现意外元素
- 可能缺少预期属性
- 可能会出现意外的属性
- 元素可能显示为空元素
- 空格可能出现在意外位置
读取者用户不应仅根据从文档读取的值分配内存。 例如,请考虑以下 xml 文档:
<array count='1000000'>
<!-- malicious document provider didn't actually provide 1000000 array items -->
</array>
基于以下假设分配数组:一些元素将遵循一定数量的元素是潜在的攻击途径。 在这种情况下,读取器的用户应改为在元素出现时以增量方式分配内存。
XML 读取器不支持 DTD。 读取器的用户无需关注 DTD 验证。
以下回调用于 XML 读取器:
以下枚举与 XML 读取器一起使用:
以下函数用于 XML 读取器:
- WsCreateReader
- WsFillReader
- WsFindAttribute
- WsFreeReader
- WsGetNamespaceFromPrefix
- WsGetReaderNode
- WsGetReaderPosition
- WsGetReaderProperty
- WsGetXmlAttribute
- WsMoveReader
- WsReadArray
- WsReadBytes
- WsReadChars
- WsReadCharsUtf8
- WsReadEndAttribute
- WsReadEndElement
- WsReadNode
- WsReadQualifiedName
- WsReadStartAttribute
- WsReadStartElement
- WsReadToStartElement
- WsReadValue
- WsSetInput
- WsSetInputToBuffer
- WsSetReaderPosition
- WsSkipNode
以下句柄用于 XML 读取器:
以下结构用于 XML 读取器:
- WS_XML_READER_BINARY_ENCODING
- WS_XML_READER_BUFFER_INPUT
- WS_XML_READER_ENCODING
- WS_XML_READER_INPUT
- WS_XML_READER_MTOM_ENCODING
- WS_XML_READER_PROPERTIES
- WS_XML_READER_PROPERTY
- WS_XML_READER_STREAM_INPUT
- WS_XML_READER_TEXT_ENCODING