System.Xml.Schema.XmlSchemaSet, klasa

Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.

Ważne

  • Nie używaj schematów z nieznanych lub niezaufanych źródeł ani lokalizacji. Spowoduje to naruszenie zabezpieczeń kodu.
  • Schematy XML (w tym schematy wbudowane) są z natury narażone na ataki typu "odmowa usługi"; nie akceptuj ich w niezaufanych scenariuszach.
  • Komunikaty o błędach weryfikacji schematu i wyjątki mogą uwidaczniać poufne informacje o ścieżce con tryb namiotu l lub URI do pliku schematu. Należy zachować ostrożność, aby nie ujawniać tych informacji niezaufanym obiektom wywołującym.
  • Dodatkowe zagadnienia dotyczące zabezpieczeń zostały omówione w sekcji "Zagadnienia dotyczące zabezpieczeń".

XmlSchemaSet to pamięć podręczna lub biblioteka, w której można przechowywać schematy języka definicji schematu XML (XSD). XmlSchemaSet Poprawia wydajność, buforując schematy w pamięci zamiast uzyskiwać do nich dostęp z pliku lub adresu URL. Każdy schemat jest identyfikowany przez identyfikator URI przestrzeni nazw i lokalizację, która została określona podczas dodawania schematu do zestawu. Właściwość służy XmlReaderSettings.Schemas do przypisywania XmlSchemaSet obiektu, którego czytelnik XML powinien używać do sprawdzania poprawności danych.

Zagadnienia dotyczące zabezpieczeń

  • Nie używaj schematów z nieznanych lub niezaufanych źródeł. Spowoduje to naruszenie zabezpieczeń kodu. Zewnętrzne przestrzenie nazw lub lokalizacje, do których odwołuje się odwołanie, obejmują, importowanie i ponowne definiowanie elementów schematu są rozpoznawane w odniesieniu do podstawowego identyfikatora URI schematu, który zawiera lub importuje je. Jeśli na przykład podstawowy identyfikator URI schematu dołączania lub importowania jest pusty lub nulllokalizacje zewnętrzne są rozpoznawane w odniesieniu do bieżącego katalogu. Klasa XmlUrlResolver jest używana do rozpoznawania schematów zewnętrznych domyślnie. Aby wyłączyć rozpoznawanie elementów dołączania, importowania i ponownego definiowania elementów schematu, ustaw XmlSchemaSet.XmlResolver właściwość na null.

  • Klasa XmlSchemaSet używa System.Text.RegularExpressions.Regex klasy do analizowania i dopasowywania wyrażeń regularnych w schemacie XML. Walidacja aspektów wzorców z wyrażeniami regularnymi w schemacie XML może obejmować zwiększone użycie procesora CPU i należy unikać w scenariuszach wysokiej dostępności.

  • Wyjątki zgłaszane w wyniku użycia XmlSchemaSet klasy, takie jak XmlSchemaException klasa, mogą zawierać poufne informacje, które nie powinny być widoczne w niezaufanych scenariuszach. Na przykład SourceUri właściwość obiektu XmlSchemaException zwraca ścieżkę identyfikatora URI do pliku schematu, który spowodował wyjątek. Właściwość SourceUri nie powinna być widoczna w niezaufanych scenariuszach. Wyjątki powinny być prawidłowo obsługiwane, aby te poufne informacje nie były widoczne w niezaufanych scenariuszach.

Przykłady

Poniższy przykład weryfikuje plik XML przy użyciu schematów przechowywanych w pliku XmlSchemaSet. Przestrzeń nazw w pliku urn:bookstore-schemaXML określa schemat używany do XmlSchemaSet walidacji. Dane wyjściowe z przykładu pokazują, że plik XML ma dwa naruszenia schematu:

  • Pierwszy <element książki> zawiera element autora>, <ale nie <zawiera żadnego tytułu> ani <elementu ceny>.

  • Element <author> w ostatnim <elemecie książki> nie ma <elementu imię i nazwisko>>, <a zamiast tego ma nieprawidłowy <element name>.

using System;
using System.Xml;
using System.Xml.Schema;
using System.IO;

public class Sample
{
  public static void Main() {

    // Create the XmlSchemaSet class.
    XmlSchemaSet sc = new XmlSchemaSet();

    // Add the schema to the collection.
    sc.Add("urn:bookstore-schema", "books.xsd");

    // Set the validation settings.
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;
    settings.Schemas = sc;
    settings.ValidationEventHandler += ValidationCallBack;

    // Create the XmlReader object.
    XmlReader reader = XmlReader.Create("booksSchemaFail.xml", settings);

    // Parse the file.
    while (reader.Read());
  }

  // Display any validation errors.
  private static void ValidationCallBack(object sender, ValidationEventArgs e) {
    Console.WriteLine($"Validation Error:\n   {e.Message}\n");
  }
}
// The example displays output like the following:
//   Validation Error:
//        The element 'book' in namespace 'urn:bookstore-schema' has invalid child element 'author'
//        in namespace 'urn:bookstore-schema'. List of possible elements expected: 'title' in
//        namespace 'urn:bookstore-schema'.
//
//    Validation Error:
//       The element 'author' in namespace 'urn:bookstore-schema' has invalid child element 'name'
//       in namespace 'urn:bookstore-schema'. List of possible elements expected: 'first-name' in
//       namespace 'urn:bookstore-schema'.
Imports System.Xml
Imports System.Xml.Schema
Imports System.IO

Public Module Sample 
  Public Sub Main() 

    ' Create the XmlSchemaSet class.
    Dim sc as XmlSchemaSet = new XmlSchemaSet()

    ' Add the schema to the collection.
    sc.Add("urn:bookstore-schema", "books.xsd")

    ' Set the validation settings.
    Dim settings as XmlReaderSettings = new XmlReaderSettings()
    settings.ValidationType = ValidationType.Schema
    settings.Schemas = sc
    AddHandler settings.ValidationEventHandler, AddressOf ValidationCallBack
 
    ' Create the XmlReader object.
    Dim reader as XmlReader = XmlReader.Create("booksSchemaFail.xml", settings)

    ' Parse the file. 
    While reader.Read()
    End While
    
  End Sub

  ' Display any validation errors.
  Private Sub ValidationCallBack(sender as object, e as ValidationEventArgs) 
    Console.WriteLine($"Validation Error:{vbCrLf}   {e.Message}")
    Console.WriteLine()
  End Sub
End Module
' The example displays output like the following:
'   Validation Error: 
'        The element 'book' in namespace 'urn:bookstore-schema' has invalid child element 'author' 
'        in namespace 'urn:bookstore-schema'. List of possible elements expected: 'title' in 
'        namespace 'urn:bookstore-schema'.
'
'    Validation Error: 
'       The element 'author' in namespace 'urn:bookstore-schema' has invalid child element 'name' 
'       in namespace 'urn:bookstore-schema'. List of possible elements expected: 'first-name' in 
'       namespace 'urn:bookstore-schema'.

Dane wejściowe

W przykładzie użyto następujących dwóch plików wejściowych.

booksSchemaFail.xml:

<?xml version='1.0'?>
<bookstore xmlns="urn:bookstore-schema">
  <book>
    <author>
      <first-name>Benjamin</first-name>
      <last-name>Franklin</last-name>
    </author>
  </book>
  <book genre="novel">
    <title>The Confidence Man</title>
    <author>
      <first-name>Herman</first-name>
      <last-name>Melville</last-name>
    </author>
    <price>11.99</price>
  </book>
  <book genre="philosophy">
    <title>The Gorgias</title>
    <author>
      <name>Plato</name>
    </author>
    <price>9.99</price>
  </book>
</bookstore>

books.xsd:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="urn:bookstore-schema"
    elementFormDefault="qualified"
    targetNamespace="urn:bookstore-schema">

 <xsd:element name="bookstore" type="bookstoreType"/>

 <xsd:complexType name="bookstoreType">
  <xsd:sequence maxOccurs="unbounded">
   <xsd:element name="book"  type="bookType"/>
  </xsd:sequence>
 </xsd:complexType>

 <xsd:complexType name="bookType">
  <xsd:sequence>
   <xsd:element name="title" type="xsd:string"/>
   <xsd:element name="author" type="authorName"/>
   <xsd:element name="price"  type="xsd:decimal"/>
  </xsd:sequence>
  <xsd:attribute name="genre" type="xsd:string"/>
 </xsd:complexType>

 <xsd:complexType name="authorName">
  <xsd:sequence>
   <xsd:element name="first-name"  type="xsd:string"/>
   <xsd:element name="last-name" type="xsd:string"/>
  </xsd:sequence>
 </xsd:complexType>

</xsd:schema>