XML リーダー

XML リーダーは、XML の入力ソース上のカーソルです。 その中核となる XML リーダーは、一度に 1 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 リーダーでは、次の構造体が使用されます。