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