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
, ,long
ulong
DateTime
int
decimal
uint
double
ushort
DateTimeOffset
TimeSpan
float
,string
Guid
, , ,SqlChars
SqlSingle
SqlMoney
SqlInt32
SqlInt16
SqlDouble
SqlDecimal
SqlGuid
SqlByte
SqlDateTime
SqlInt64
SqlBytes
SqlBinary
SqlBoolean
ve .SqlString
sbyte
char
bool
- Yaygın olarak kullanılan ilkel olmayan öğeler:
Type
,Uri
veBigInteger
. - Yaygın olarak kullanılan System.Drawing türleri:
Color
,Point
,PointF
,Rectangle
,RectangleF
,Size
, veSizeF
. 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
'DataTable
ReadXml
a 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.Fill
DataTable
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.CustomType
ekleyerek 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.SetData
de 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:
- öğesine yerleştirecek
<configSections>
uygun değer hakkında bilgi için bu belgenin Yapılandırmayı genişletme bölümüne bakın. - Aşağıdaki işaretlemede gösterildiği gibi denetim modunu etkinleştirmek için kullanın
<allowedTypes auditOnly="true">
.
<?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 TraceListener
hakkı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 'AppContext
den DataTable
DataSet
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ı".
AllowArbitraryDataSetTypeInstantiation
aş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\AppContext
bulunur.
yapılandırmak için AppContext
kayı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 veDataAdapter.Fill
yöntemi bir veritabanı sorgusunun içeriğiyle doldurmakDataSet
için kullanılır. DataSet.ReadXml
veyaDataTable.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 birDataSet
veyaDataTable
örneğini seri durumdan çıkarmak için kullanılır. - gibi
JsonConvert
bir seri hale getirici, JSON akışından birDataSet
veyaDataTable
örneğini seri durumdan çıkarmak için kullanılır.JsonConvert
, popüler üçüncü taraf Newtonsoft.Json kitaplığındaki bir yöntemdir. - gibi
BinaryFormatter
birDataSet
seri hale getirici, bir veyaDataTable
ö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
'DataAdapter
den 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.ReadXml
iç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
, SoapFormatter
veya 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 edinDataSet
veya aracılığıyla. - Güvenilmeyen verileri veya
DataTable
örneğine seri durumdanDataSet
çı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