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 の文法仕様に従い、さらにその側面が指定されたクォータ内にあることを確認しますが、信頼されていないソースからのドキュメントのコンテンツは信頼されていないと見なす必要があります。 リーダーのユーザーは、WsReadToStartElementWsFindAttribute、またはノードを手動で検査して、すべての要素と属性の名前と名前空間をチェックする必要があります。

考慮すべきその他の状況には、次のようなものがありますが、これらに限定されません。

  • 予期される要素が見つからない可能性があります
  • 予期しない要素が表示される場合がある
  • 予期される属性が見つからない可能性があります
  • 予期しない属性が表示される可能性がある
  • 要素は空の要素として表示される場合があります
  • 空白が予期しない場所に表示される場合がある

リーダーのユーザーは、ドキュメントから読み取られた値に基づいてメモリを割り当てないようにする必要があります。 たとえば、次の xml ドキュメントを考えてみましょう。

<array count='1000000'>
   <!-- malicious document provider didn't actually provide 1000000 array items -->
</array>

一部の要素が続くという前提に基づいて配列を割り当てることは、潜在的な攻撃ベクトルになります。 この場合、リーダーのユーザーは、代わりに要素が表示される際にメモリを段階的に割り当てる必要があります。

XML リーダーは DTD をサポートしていません。 リーダーのユーザーは、DTD 検証について心配する必要はありません。

XML リーダーでは、次のコールバックが使用されます。

XML リーダーでは、次の列挙が使用されます。

XML リーダーでは、次の関数が使用されます。

XML リーダーでは、次のハンドルが使用されます。

XML リーダーでは、次の構造体が使用されます。