System.Xml.Schema.XmlSchemaSet sınıfı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

Önemli

  • Bilinmeyen veya güvenilmeyen kaynaklardan veya konumlardan şemaları kullanmayın. Bunu yaptığınızda kodunuzun güvenliği tehlikeye girer.
  • XML şemaları (satır içi şemalar dahil) hizmet reddi saldırılarına karşı doğal olarak savunmasızdır; güvenilmeyen senaryolarda bunları kabul etmeyin.
  • Şema doğrulama hata iletileri ve özel durumlar, şema dosyasının con çadır modu l veya URI yolları hakkında hassas bilgileri kullanıma sunabilir. Bu bilgileri güvenilmeyen arayanlara göstermemeye dikkat edin.
  • Ek güvenlik konuları "GüvenlikLe İlgili Önemli Noktalar" bölümünde ele alınmıştır.

XmlSchemaSet , XML Şema tanım dili (XSD) şemalarını depolayabileceğiniz bir önbellek veya kitaplıktır. XmlSchemaSet şemalara bir dosyadan veya URL'den erişmek yerine bellekte önbelleğe alarak performansı artırır. Her şema, ad alanı URI'sine ve şema kümeye eklendiğinde belirtilen konuma göre tanımlanır. Bir XML okuyucusunun XmlReaderSettings.SchemasXmlSchemaSet veri doğrulaması için kullanması gereken nesneyi atamak için özelliğini kullanırsınız.

Güvenlik konuları

  • Bilinmeyen veya güvenilmeyen kaynaklardan gelen şemaları kullanmayın. Bunu yaptığınızda kodunuzun güvenliği tehlikeye girer. Bir şemanın öğelerini dahil etme, içeri aktarma ve yeniden tanımlama konusunda başvuruda bulunulan dış ad alanları veya konumlar, bunları içeren veya içeri aktaran şemanın temel URI'sine göre çözümlenir. Örneğin, dahil etme veya içeri aktarma şemasının temel URI'si boşsa veya nulldış konumlar geçerli dizine göre çözümlenir. XmlUrlResolver sınıfı, dış şemaları varsayılan olarak çözümlemek için kullanılır. Şemanın öğelerini dahil etme, içeri aktarma ve yeniden tanımlama çözümlemesini devre dışı bırakmak için özelliğini olarak nullayarlayınXmlSchemaSet.XmlResolver.

  • sınıfı, XmlSchemaSet xml şemasındaki System.Text.RegularExpressions.Regex normal ifadeleri ayrıştırmak ve eşleştirmek için sınıfını kullanır. Xml şemasında normal ifadelerle desen modellerinin doğrulanması daha fazla CPU kullanımı içerebilir ve yüksek kullanılabilirlik senaryolarında kaçınılmalıdır.

  • Sınıfın kullanılması XmlSchemaSet sonucunda ortaya çıkan özel durumlar, örneğin XmlSchemaException sınıfı güvenilmeyen senaryolarda kullanıma sunulmaması gereken hassas bilgiler içerebilir. Örneğin, SourceUri özelliği XmlSchemaException özel duruma neden olan şema dosyasının URI yolunu döndürür. SourceUri özelliği güvenilmeyen senaryolarda kullanıma sunulmamalıdır. Bu hassas bilgilerin güvenilmeyen senaryolarda kullanıma sunulmaması için özel durumlar düzgün bir şekilde işlenmelidir.

Örnekler

Aşağıdaki örnek, içinde XmlSchemaSetdepolanan şemaları kullanarak bir XML dosyasını doğrular. XML dosyasındaki ad alanı, urn:bookstore-schemaiçinde doğrulama için kullanılacak şemayı XmlSchemaSet tanımlar. Örnekten alınan çıktı, XML dosyasının iki şema ihlali olduğunu gösterir:

  • İlk <kitap> öğesi bir <yazar> öğesi içerir, ancak başlık> veya <fiyat> öğesi içermez<.

  • Son <<kitap> öğesindeki author> öğesinde bir <ad> ve <soyadı> öğesi eksik ve bunun yerine geçersiz <bir ad> öğesi var.

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'.

Girdi

Örnek aşağıdaki iki giriş dosyasını kullanır.

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>