DataSet ve DataTable güvenlik kılavuzu

Bu makale şunlar için geçerlidir:

  • .NET Framework (tüm sürümler)
  • .NET Core ve üzeri
  • .NET 5 ve üzeri

DataSet ve DataTable türleri, veri kümelerini yönetilen nesneler olarak temsil eden eski .NET bileşenleridir. Bu bileşenler özgün ADO.NET altyapısının bir parçası olarak .NET Framework 1.0'da kullanıma sunulmuştur. Amaç, bir ilişkisel veri kümesi üzerinde yönetilen bir görünüm sağlamak ve verilerin temel alınan kaynağının XML, SQL veya başka bir teknoloji olup olmadığını soyutlamaydı.

Daha modern veri görünümü paradigması dahil olmak üzere ADO.NET hakkında daha fazla bilgi için ADO.NET belgelerine bakın.

XML'den DataSet veya DataTable seri durumdan çıkarılırken varsayılan kısıtlamalar

.NET Framework, .NET Core ve .NET'in desteklenen tüm sürümlerinde, DataSet DataTable seri durumdan çıkarılmış verilerde hangi nesne türlerinin bulunabileceğine ilişkin aşağıdaki kısıtlamaları uygulayın. Varsayılan olarak, bu liste şu şekilde sınırlandırılır:

  • Temel öğeler ve ilkel eşdeğerleri: , , , , byte, short, , longulongDateTimeintdecimaluintdoubleushortDateTimeOffsetTimeSpanfloat, stringGuid, , , SqlCharsSqlSingleSqlMoneySqlInt32SqlInt16SqlDoubleSqlDecimalSqlGuidSqlByteSqlDateTimeSqlInt64SqlBytesSqlBinarySqlBooleanve .SqlStringsbytecharbool
  • Yaygın olarak kullanılan ilkel olmayan öğeler: Type, Urive BigInteger.
  • Yaygın olarak kullanılan System.Drawing türleri: Color, Point, PointF, Rectangle, RectangleF, Size, ve SizeF.
  • Enum Tür.
  • Yukarıdaki türlerin dizileri ve listeleri.

Gelen XML verileri türü bu listede olmayan bir nesne içeriyorsa:

  • Aşağıdaki ileti ve yığın izlemesiyle bir özel durum oluşturulur. Hata İletisi: System.InvalidOperationException: Buraya '<Tür Adı>, Sürüm=<n.n.n.n>, Culture=<culture>, PublicKeyToken=<token değeri' türüne> izin verilmiyor. Yığın İzleme: System.Data.DataColumn.UpdateColumnType(Tür türü, StorageType typeCode) konumundaki System.Data.TypeLimiter.EnsureTypeIsAllowed(Tür türü, TypeLimiter capturedLimiter) konumunda System.Data.DataColumn.set_DataType(Tür değeri)

  • Seri durumdan çıkarma işlemi başarısız oluyor.

XML'yi mevcut DataSet veya DataTable örneğe yüklerken, mevcut sütun tanımları da dikkate alınır. Tablo zaten özel türde bir sütun tanımı içeriyorsa, xml seri durumdan çıkarma işlemi süresi boyunca bu tür geçici olarak izin ver listesine eklenir.

Not

'DataTableReadXmla sütun ekledikten sonra XML'den şemayı okumaz ve şema eşleşmezse kayıtlarda da okumaz, bu nedenle bu yöntemi kullanmak için tüm sütunları kendiniz eklemeniz gerekir.

XmlReader xmlReader = GetXmlReader();

// Assume the XML blob contains data for type MyCustomClass.
// The following call to ReadXml fails because MyCustomClass isn't in the allowed types list.

DataTable table = new DataTable("MyDataTable");
table.ReadXml(xmlReader);

// However, the following call to ReadXml succeeds, since the DataTable instance
// already defines a column of type MyCustomClass.

DataTable table = new DataTable("MyDataTable");
table.Columns.Add("MyColumn", typeof(MyCustomClass));
table.ReadXml(xmlReader); // this call will succeed

Nesne türü kısıtlamaları, veya DataTableörneğini DataSet seri durumdan çıkarmak için kullanılırken XmlSerializer de geçerlidir. Ancak, veya DataTableörneğini DataSet seri durumdan çıkarmak için kullanılırken BinaryFormatter uygulanamayabilir.

Nesne türü kısıtlamaları, örneğin XML seri durumdan çıkarma API'leri kullanılmadan doğrudan bir veritabanından doldurulması gibi kullanılırken DataAdapter.FillDataTable uygulanmaz.

İzin verilen türler listesini genişletme

Bir uygulama, izin verilen türler listesini yukarıda listelenen yerleşik türlere ek olarak özel türler içerecek şekilde genişletebilir. İzin verilen türler listesi genişletildiyse, değişiklik uygulama içindeki tüm DataSet ve DataTable örnekleri etkiler. Türler, yerleşik izin verilen türler listesinden kaldırılamaz.

Yapılandırma aracılığıyla genişletme (.NET Framework 4.0 ve üzeri)

App.config , izin verilen türler listesini genişletmek için kullanılabilir. İzin verilen türler listesini genişletmek için:

  • <configSections> System.Data yapılandırma bölümüne başvuru eklemek için öğesini kullanın.
  • Ek türleri belirtmek için kullanın <system.data.dataset.serialization>/<allowedTypes> .

Her <add> öğe, derleme türü adını kullanarak yalnızca bir tür belirtmelidir. İzin verilen türler listesine ek türler eklemek için birden çok <add> öğe kullanın.

Aşağıdaki örnek, özel türünü Fabrikam.CustomTypeekleyerek izin verilen türler listesini genişletmeyi gösterir.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="system.data.dataset.serialization" type="System.Data.SerializationSettingsSectionGroup, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="allowedTypes" type="System.Data.AllowedTypesSectionHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </sectionGroup>
  </configSections>
  <system.data.dataset.serialization>
    <allowedTypes>
      <!-- <add type="assembly qualified type name" /> -->
      <add type="Fabrikam.CustomType, Fabrikam, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2b3831f2f2b744f7" />
      <!-- additional <add /> elements as needed -->
    </allowedTypes>
  </system.data.dataset.serialization>
</configuration>

Bir türün derleme tam adını almak için, aşağıdaki kodda gösterildiği gibi Type.AssemblyQualifiedName özelliğini kullanın.

string assemblyQualifiedName = typeof(Fabrikam.CustomType).AssemblyQualifiedName;

Yapılandırma aracılığıyla genişletme (.NET Framework 2.0 - 3.5)

Uygulamanız .NET Framework 2.0 veya 3.5'i hedef alıyorsa, izin verilen türler listesini genişletmek için yukarıdaki App.config mekanizmasını kullanmaya devam edebilirsiniz. Ancak, aşağıdaki kodda gösterildiği gibi öğeniz <configSections> biraz farklı görünür:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <!-- The below <sectionGroup> and <section> are specific to .NET Framework 2.0 and 3.5. -->
    <sectionGroup name="system.data.dataset.serialization" type="System.Data.SerializationSettingsSectionGroup, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="allowedTypes" type="System.Data.AllowedTypesSectionHandler, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </sectionGroup>
  </configSections>
  <system.data.dataset.serialization>
    <allowedTypes>
      <!-- <add /> elements, as demonstrated in the .NET Framework 4.0 - 4.8 sample code above. -->
    </allowedTypes>
  </system.data.dataset.serialization>
</configuration>

Program aracılığıyla genişletme (.NET Framework, .NET Core, .NET 5+)

İzin verilen türlerin listesi, aşağıdaki kodda gösterildiği gibi AppDomain.SetData ile iyi bilinen System.Data.DataSetDefaultAllowedTypes anahtarı kullanılarak program aracılığıyla da genişletilebilir.

Type[] extraAllowedTypes = new Type[]
{
    typeof(Fabrikam.CustomType),
    typeof(Contoso.AdditionalCustomType)
};

AppDomain.CurrentDomain.SetData("System.Data.DataSetDefaultAllowedTypes", extraAllowedTypes);

Uzantı mekanizması kullanılıyorsa, System.Data.DataSetDefaultAllowedTypes anahtarıyla ilişkili değer türünde Type[]olmalıdır.

.NET Framework'te, izin verilen türlerin listesi hem App.config hem AppDomain.SetDatade ile genişletilebilir. Bu durumda DataSet ve DataTable türü her iki listede de varsa, bir nesnenin verilerin bir parçası olarak seri durumdan çıkarılmasına izin verir.

Uygulamayı denetim modunda çalıştırma (.NET Framework)

.NET Framework'te DataSet ve DataTable bir denetim modu özelliği sağlayın. Denetim modu etkinleştirildiğinde ve DataSet DataTable gelen nesne türlerini izin verilen türler listesiyle karşılaştırın. Ancak, türüne izin verilmeyen bir nesne görülürse, bir özel durum oluşturmaz . Bunun yerine, DataSet ekli TraceListener örneklere şüpheli bir türün mevcut olduğunu bildirin ve DataTable bu bilgilerin günlüğe kaydedilmesine TraceListener izin verin. Özel durum oluşturulur ve seri durumdan çıkarma işlemi devam eder.

Uyarı

Bir uygulamayı "denetim modunda" çalıştırmak yalnızca test için kullanılan geçici bir ölçü olmalıdır. Denetim modu etkinleştirildiğinde DataSet ve DataTable uygulamanızın içinde bir güvenlik deliği oluşturabilecek tür kısıtlamaları uygulamayın. Daha fazla bilgi için Tüm tür kısıtlamalarını kaldırma ve Güvenilmeyen girişle ilgili güvenlik başlıklı bölümlere bakın.

Denetim modu App.config aracılığıyla etkinleştirilebilir:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <!-- See the section of this document titled "Extending through configuration" for the appropriate
         <sectionGroup> and <section> elements to put here, depending on whether you're running .NET
         Framework 2.0 - 3.5 or 4.0 - 4.8. -->
  </configSections>
  <system.data.dataset.serialization>
    <allowedTypes auditOnly="true"> <!-- setting auditOnly="true" enables audit mode -->
      <!-- Optional <add /> elements as needed. -->
    </allowedTypes>
  </system.data.dataset.serialization>
</configuration>

Denetim modu etkinleştirildikten sonra App.config'i kullanarak tercih TraceListener DataSet ettiğiniz yerleşike TraceSource. bağlanabilirsiniz Yerleşik izleme kaynağının adı System.Data.DataSet'tir. Aşağıdaki örnek, konsola ve disk üzerindeki bir günlük dosyasına izleme olayları yazmayı gösterir.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.Data.DataSet"
              switchType="System.Diagnostics.SourceSwitch"
              switchValue="Warning">
        <listeners>
          <!-- write to the console -->
          <add name="console"
               type="System.Diagnostics.ConsoleTraceListener" />
          <!-- *and* write to a log file on disk -->
          <add name="filelog"
               type="System.Diagnostics.TextWriterTraceListener"
               initializeData="c:\logs\mylog.txt" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
</configuration>

ve TraceListenerhakkında TraceSource daha fazla bilgi için Nasıl yapılır: İzleme Dinleyicileriyle TraceSource ve Filtreleri Kullanma belgesine bakın.

Not

Bir uygulamayı denetim modunda çalıştırmak .NET Core veya .NET 5 ve sonraki sürümlerde kullanılamaz.

Tüm tür kısıtlamalarını kaldırma

Bir uygulamanın ve DataTable'den DataSet tüm tür sınırlama kısıtlamalarını kaldırması gerekiyorsa:

  • Tür sınırlama kısıtlamalarını gizlemeye yönelik çeşitli seçenekler vardır.
  • Kullanılabilir seçenekler, uygulamanın hedefledikleri çerçeveye bağlıdır.

Uyarı

Tüm tür kısıtlamalarının kaldırılması, uygulamanın içinde bir güvenlik deliği oluşturabilir. Bu mekanizmayı kullanırken, uygulamanın güvenilmeyen girişi kullanmadığından DataSet veya DataTable okumadığından emin olun. Daha fazla bilgi için CVE-2020-1147 ve Güvenilmeyen girişlerle ilgili güvenlik başlıklı aşağıdaki bölüme bakın.

AppContext yapılandırması aracılığıyla (.NET Framework 4.6 ve üzeri, .NET Core 2.1 ve üzeri, .NET 5 ve üzeri)

ve 'AppContextden DataTableDataSet tüm tür sınırlama kısıtlamalarını kaldıracak true şekilde ayarlandığında, anahtarıSwitch.System.Data.AllowArbitraryDataSetTypeInstantiation.

.NET Framework'te bu anahtar, aşağıdaki yapılandırmada gösterildiği gibi App.config aracılığıyla etkinleştirilebilir:

<configuration>
   <runtime>
      <!-- Warning: setting the following switch can introduce a security problem. -->
      <AppContextSwitchOverrides value="Switch.System.Data.AllowArbitraryDataSetTypeInstantiation=true" />
   </runtime>
</configuration>

ASP.NET öğesi <AppContextSwitchOverrides> kullanılamaz. Bunun yerine, anahtar aşağıdaki yapılandırmada gösterildiği gibi Web.config aracılığıyla etkinleştirilebilir:

<configuration>
    <appSettings>
        <!-- Warning: setting the following switch can introduce a security problem. -->
        <add key="AppContext.SetSwitch:Switch.System.Data.AllowArbitraryDataSetTypeInstantiation" value="true" />
    </appSettings>
</configuration>

Daha fazla bilgi için bkz <. AppContextSwitchOverrides> öğesi.

.NET Core, .NET 5 ve ASP.NET Core'da bu ayar, aşağıdaki JSON'da gösterildiği gibi runtimeconfig.json tarafından denetlenir:

{
  "runtimeOptions": {
    "configProperties": {
      "Switch.System.Data.AllowArbitraryDataSetTypeInstantiation": true
    }
  }
}

Daha fazla bilgi için bkz . ".NET Core çalışma zamanı yapılandırma ayarları".

AllowArbitraryDataSetTypeInstantiationaşağıdaki kodda gösterildiği gibi, bir yapılandırma dosyası kullanmak yerine AppContext.SetSwitch aracılığıyla program aracılığıyla da ayarlanabilir:

// Warning: setting the following switch can introduce a security problem.
AppContext.SetSwitch("Switch.System.Data.AllowArbitraryDataSetTypeInstantiation", true);

Yukarıdaki programlı yaklaşımı seçerseniz çağrısı, AppContext.SetSwitch uygulamaların başlangıcında erken gerçekleşmelidir.

Makine genelinde kayıt defteri aracılığıyla (.NET Framework 2.0 - 4.x)

Kullanılamıyorsa AppContext , tür sınırlama denetimleri Windows kayıt defteriyle devre dışı bırakılabilir:

  • Bir yöneticinin kayıt defterini yapılandırması gerekir.
  • Kayıt defterinin kullanılması makine genelinde yapılan bir değişikliktir ve makinede çalışan tüm uygulamaları etkiler.
Tür Değer
Kayıt defteri anahtarı HKLM\SOFTWARE\Microsoft\.NETFramework\AppContext
Değer adı Switch.System.Data.AllowArbitraryDataSetTypeInstantiation
Değer türü REG_SZ
Değer verileri true

64 bit işletim sisteminde bu değerin hem 64 bit anahtar (yukarıda gösterilen) hem de 32 bit anahtar için eklenmesi gerekiyor. 32 bit anahtar konumunda HKLM\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\AppContextbulunur.

yapılandırmak için AppContextkayıt defterini kullanma hakkında daha fazla bilgi için bkz . "Kitaplık tüketicileri için AppContext".

Güvenilmeyen girişlerle ilgili güvenlik

DataTable XML DataSet yüklerini seri durumdan çıkarırken mevcut olması için izin verilen türler için varsayılan sınırlamalarDataSet uygular ve DataTable güvenilmeyen girişlerle doldurulduğunda genel olarak güvenli değildir. Aşağıda, bir veya DataTable örneğin güvenilmeyen girişleri okuyabileceği yöntemlerin kapsamlı olmayan bir DataSet listesi yer alır.

  • bir DataAdapter veritabanına başvurur ve DataAdapter.Fill yöntemi bir veritabanı sorgusunun içeriğiyle doldurmak DataSet için kullanılır.
  • DataSet.ReadXml veya DataTable.ReadXml yöntemi, sütun ve satır bilgilerini içeren bir XML dosyasını okumak için kullanılır.
  • Veya DataSet DataTable örneği, ASP.NET (SOAP) web hizmetlerinin veya WCF uç noktasının bir parçası olarak serileştirilir.
  • gibi XmlSerializer bir seri hale getirici, xml akışından bir DataSet veya DataTable örneğini seri durumdan çıkarmak için kullanılır.
  • gibi JsonConvert bir seri hale getirici, JSON akışından bir DataSet veya DataTable örneğini seri durumdan çıkarmak için kullanılır. JsonConvert , popüler üçüncü taraf Newtonsoft.Json kitaplığındaki bir yöntemdir.
  • gibi BinaryFormatter bir DataSet seri hale getirici, bir veya DataTable örneğini ham bayt akışından seri durumdan çıkarmak için kullanılır.

Bu belgede, önceki senaryolar için güvenlikle ilgili dikkat edilmesi gerekenler ele alınmaktadır.

Güvenilmeyen bir veri kaynağından doldurmak DataSet için kullanın DataAdapter.Fill

DataSet Bir örnek, aşağıdaki örnekte gösterildiği gibi yöntemi kullanılarak DataAdapter.Fill 'DataAdapterden doldurulabilir.

// Assumes that connection is a valid SqlConnection object.
string queryString =
  "SELECT CustomerID, CompanyName FROM dbo.Customers";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");

(Yukarıdaki kod örneği, adresinde bulunan daha büyük bir örneğin parçasıdırDataAdapter'dan DataSet doldurma.)

Çoğu uygulama, veritabanı katmanlarının güvenilir olduğunu basitleştirebilir ve varsayabilir. Ancak, uygulamalarınızı tehdit modelleme alışkanlığınız varsa, tehdit modeliniz uygulama (istemci) ile veritabanı katmanı (sunucu) arasında bir güven sınırı olduğunu düşünebilir. İstemci ve sunucu arasında karşılıklı kimlik doğrulaması veya AAD kimlik doğrulaması kullanmak, bununla ilişkili riskleri ele almak için bir yoldur. Bu bölümün geri kalanında, bir istemcinin güvenilmeyen bir sunucuya bağlanmasının olası sonucu açıklanmıştır.

Güvenilmeyen bir veri kaynağına işaret etme DataAdapter sonuçları, kendi uygulamasına DataAdapter bağlıdır.

SqlDataAdapter

Yerleşik SqlDataAdapter türü için güvenilmeyen bir veri kaynağına başvurmak hizmet reddi (DoS) saldırısına neden olabilir. DoS saldırısı, uygulamanın yanıt vermemeye başlamasına veya kilitlenmesine neden olabilir. Bir saldırgan uygulamanın yanına bir DLL ekebiliyorsa, yerel kod yürütmeyi de gerçekleştirebilir.

Diğer DataAdapter türleri

Üçüncü taraf DataAdapter uygulamaları, güvenilmeyen girişler karşısında hangi güvenlik garantilerini sağladığı hakkında kendi değerlendirmelerini yapmalıdır. .NET, bu uygulamalarla ilgili herhangi bir güvenlik garantisi veremez.

DataSet.ReadXml ve DataTable.ReadXml

DataSet.ReadXml güvenilmeyen girişlerle kullanıldığında ve DataTable.ReadXml yöntemleri güvenli değildir. Tüketicilerin bunun yerine bu belgenin devamında özetlenen alternatiflerden birini kullanmayı düşünmelerini kesinlikle öneririz.

ve DataTable.ReadXml uygulamaları DataSet.ReadXml ilk olarak serileştirme güvenlik açıkları iyi anlaşılmış bir tehdit kategorisi olmadan önce oluşturulmuştur. Sonuç olarak, kod geçerli güvenlik en iyi yöntemlerini izlemez. Bu API'ler, saldırganların web uygulamalarına karşı DoS saldırıları gerçekleştirmesi için vektör olarak kullanılabilir. Bu saldırılar web hizmetinin yanıt vermemesini veya beklenmeyen işlem sonlandırması ile sonuçlanmasına neden olabilir. Çerçeve, bu saldırı kategorileri için risk azaltma sağlamaz ve .NET bu davranışı "tasarım gereği" değerlendirir.

.NET, ve DataTable.ReadXmliçinde bilgilerin açığa çıkması veya uzaktan kod yürütülmesi DataSet.ReadXml gibi bazı sorunları azaltmak için güvenlik güncelleştirmeleri yayımladı. .NET güvenlik güncelleştirmeleri bu tehdit kategorilerine karşı tam koruma sağlamayabilir. Tüketiciler kendi senaryolarını değerlendirmeli ve bu risklere maruz kalma olasılıklarını dikkate almalıdır.

Tüketiciler, bu API'lere yapılan güvenlik güncelleştirmelerinin bazı durumlarda uygulama uyumluluğunu etkileyebilmelidir. Ayrıca, bu API'lerde .NET'in pratikte bir güvenlik güncelleştirmesi yayımlayabildiği yeni bir güvenlik açığının keşfedilmesi olasılığı da vardır.

Bu API'lerin tüketicilerinin de şunları yapmanızı öneririz:

  • Bu belgenin ilerleyen bölümlerinde özetlenen alternatiflerden birini kullanmayı göz önünde bulundurun.
  • Uygulamalarında bireysel risk değerlendirmeleri gerçekleştirin.

Bu API'lerin kullanılıp kullanılmayacağını belirlemek yalnızca tüketicinin sorumluluğundadır. Tüketiciler, bu API'leri kullanmaya eşlik eden yasal gereksinimler de dahil olmak üzere tüm güvenlik, teknik ve yasal riskleri değerlendirmelidir.

ASP.NET web hizmetleri veya WCF aracılığıyla DataSet ve DataTable

Aşağıdaki kodda gösterildiği gibi ASP.NET (SOAP) web hizmetinde bir veya DataTable örneğini kabul DataSet etmek mümkündür:

using System.Data;
using System.Web.Services;

[WebService(Namespace = "http://contoso.com/")]
public class MyService : WebService
{
    [WebMethod]
    public string MyWebMethod(DataTable dataTable)
    {
        /* Web method implementation. */
    }
}

Bunun bir varyasyonu parametre olarak kabul DataSet etmek veya DataTable doğrudan değil, bunun yerine aşağıdaki kodda gösterildiği gibi genel SOAP serileştirilmiş nesne grafiğinin bir parçası olarak kabul etmektir:

using System.Data;
using System.Web.Services;

[WebService(Namespace = "http://contoso.com/")]
public class MyService : WebService
{
    [WebMethod]
    public string MyWebMethod(MyClass data)
    {
        /* Web method implementation. */
    }
}

public class MyClass
{
    // Property of type DataTable, automatically serialized and
    // deserialized as part of the overall MyClass payload.
    public DataTable MyDataTable { get; set; }
}

Alternatif olarak, ASP.NET web hizmetleri yerine WCF kullanma:

using System.Data;
using System.ServiceModel;

[ServiceContract(Namespace = "http://contoso.com/")]
public interface IMyContract
{
    [OperationContract]
    string MyMethod(DataTable dataTable);
    [OperationContract]
    string MyOtherMethod(MyClass data);
}

public class MyClass
{
    // Property of type DataTable, automatically serialized and
    // deserialized as part of the overall MyClass payload.
    public DataTable MyDataTable { get; set; }
}

Tüm bu durumlarda tehdit modeli ve güvenlik garantileri DataSet.ReadXml ve DataTable.ReadXml bölümüyle aynıdır.

XmlSerializer aracılığıyla DataSet veya DataTable'ın seri durumdan çıkarılması

Geliştiriciler, aşağıdaki kodda gösterildiği gibi seri durumdan çıkarmak DataSet ve DataTable örnekleri kullanmak için kullanabilirXmlSerializer:

using System.Data;
using System.IO;
using System.Xml.Serialization;

public DataSet PerformDeserialization1(Stream stream) {
    XmlSerializer serializer = new XmlSerializer(typeof(DataSet));
    return (DataSet)serializer.Deserialize(stream);
}

public MyClass PerformDeserialization2(Stream stream) {
    XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
    return (MyClass)serializer.Deserialize(stream);
}

public class MyClass
{
    // Property of type DataTable, automatically serialized and
    // deserialized as part of the overall MyClass payload.
    public DataTable MyDataTable { get; set; }
}

Bu gibi durumlarda tehdit modeli ve güvenlik garantileri DataSet.ReadXml ve DataTable.ReadXml bölümüyle aynıdır

JsonConvert aracılığıyla DataSet veya DataTable'ın seri durumdan çıkarılması

Popüler üçüncü taraf Newtonsoft kitaplığı Json.NET , aşağıdaki kodda gösterildiği gibi seri durumdan DataSet çıkarmak ve DataTable örnekleri kullanmak için kullanılabilir:

using System.Data;
using Newtonsoft.Json;

public DataSet PerformDeserialization1(string json) {
    return JsonConvert.DeserializeObject<DataSet>(data);
}

public MyClass PerformDeserialization2(string json) {
    return JsonConvert.DeserializeObject<MyClass>(data);
}

public class MyClass
{
    // Property of type DataTable, automatically serialized and
    // deserialized as part of the overall MyClass payload.
    public DataTable MyDataTable { get; set; }
}

Güvenilmeyen bir JSON blobundan veya DataSet DataTable bu şekilde seri durumdan çıkarma güvenli değildir. Bu düzen, hizmet reddi saldırısına karşı savunmasızdır. Böyle bir saldırı, uygulamayı kilitler veya yanıt vermez hale getirir.

Not

Microsoft, Newtonsoft.Json gibi üçüncü taraf kitaplıkların uygulanmasını garanti etmez veya desteklemez. Bu bilgiler tamlık için verilmiştir ve bu yazının yazılıp yazılma zamanından itibaren doğrudur.

BinaryFormatter aracılığıyla DataSet veya DataTable'ın seri durumdan çıkarılması

Bir veya örneğini güvenilmeyen bir yükten seri durumdan DataSet çıkarmak için hiçbir zaman , NetDataContractSerializer, SoapFormatterveya DataTable ilgili güvenli olmayan biçimlendiricileri kullanmamalısınızBinaryFormatter:

  • Bu, tam uzaktan kod yürütme saldırısına açıktır.
  • Özel SerializationBinder kullanmak, böyle bir saldırıyı önlemek için yeterli değildir.

Güvenli değiştirmeler

Aşağıdakilerden biri olan uygulamalar için:

  • .asmx SOAP uç noktasını veya DataTable WCF uç noktasını kabul edin DataSet veya aracılığıyla.
  • Güvenilmeyen verileri veya DataTableörneğine seri durumdan DataSet çıkarın.

Entity Framework kullanmak için nesne modelini değiştirmeyi göz önünde bulundurun. Entity Framework:

  • İlişkisel verileri temsil eden zengin, modern, nesne odaklı bir çerçevedir.
  • Entity Framework nesne modelleriniz aracılığıyla veritabanı sorgularını yansıtmayı kolaylaştırmak için çeşitli veritabanı sağlayıcıları ekosistemi sunar.
  • Güvenilmeyen kaynaklardan gelen verileri seri durumdan çıkarırken yerleşik korumalar sunar.

SOAP uç noktalarını kullanan .aspx uygulamalar için bu uç noktaları WCF kullanacak şekilde değiştirmeyi göz önünde bulundurun. WCF, web hizmetleri için .asmx daha tam özellikli bir değişimdir. WCF uç noktaları , mevcut arayanlarla uyumluluk için SOAP aracılığıyla gösterilebilir.

Kod çözümleyicileri

Kaynak kodunuz derlendiğinde çalışan kod çözümleyicisi güvenlik kuralları, C# ve Visual Basic kodunda bu güvenlik sorunuyla ilgili güvenlik açıklarının bulunmasına yardımcı olabilir. Microsoft.CodeAnalysis.FxCopAnalyzers, nuget.org üzerinde dağıtılan bir kod çözümleyicileri NuGet paketidir.

Kod çözümleyicilerine genel bakış için bkz . Kaynak kod çözümleyicilerine genel bakış.

Aşağıdaki Microsoft.CodeAnalysis.FxCopAnalyzers kurallarını etkinleştirin:

  • CA2350: DataTable.ReadXml() dosyasını güvenilmeyen verilerle kullanmayın
  • CA2351: DataSet.ReadXml() dosyasını güvenilmeyen verilerle kullanmayın
  • CA2352: Seri hale getirilebilir türde güvenli olmayan DataSet veya DataTable, uzaktan kod yürütme saldırılarına karşı savunmasız olabilir
  • CA2353: Seri hale getirilebilir türde güvenli olmayan DataSet veya DataTable
  • CA2354: Seri durumdan çıkarılmış nesne grafında güvenli olmayan DataSet veya DataTable, uzaktan kod yürütme saldırılarına karşı savunmasız olabilir
  • CA2355: Seri durumdan çıkarılabilir nesne grafında güvenli olmayan DataSet veya DataTable türü bulundu
  • CA2356: Web seri durumdan çıkarılabilir nesne grafiğinde güvenli olmayan DataSet veya DataTable türü
  • CA2361: DataSet.ReadXml() içeren otomatik oluşturulan sınıfın güvenilmeyen verilerle kullanılmadığından emin olun
  • CA2362: Otomatik olarak oluşturulan serileştirilebilir türdeki güvenli olmayan DataSet veya DataTable, uzaktan kod yürütme saldırılarına karşı savunmasız olabilir

Kuralları yapılandırma hakkında daha fazla bilgi için bkz . Kod çözümleyicilerini kullanma.

Yeni güvenlik kuralları aşağıdaki NuGet paketlerinde kullanılabilir:

  • Microsoft.CodeAnalysis.FxCopAnalyzers 3.3.0: Visual Studio 2019 sürüm 16.3 veya üzeri için
  • Microsoft.CodeAnalysis.FxCopAnalyzers 2.9.11: Visual Studio 2017 sürüm 15.9 veya üzeri için