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