Pokyny k zabezpečení datových sad a datových tabulek
Tento článek se týká:
- .NET Framework (všechny verze)
- .NET Core a novější
- .NET 5 a novější
Typy DataSet a DataTable jsou starší komponenty .NET, které umožňují reprezentaci datových sad jako spravovaných objektů. Tyto komponenty byly zavedeny v rozhraní .NET Framework 1.0 jako součást původní infrastruktury ADO.NET. Jejich cílem bylo poskytnout spravovaný pohled na relační datovou sadu a abstrahovat, zda podkladový zdroj dat byl XML, SQL nebo jiná technologie.
Další informace o ADO.NET, včetně modernějších paradigmat zobrazení dat, najdete v ADO.NET dokumentaci.
Výchozí omezení při deserializaci datové sady nebo datové tabulky z XML
Ve všech podporovaných verzích rozhraní .NET Framework, .NET Core a .NET a DataTable
umisťujte následující omezení pro typy objektů, DataSet
které mohou být přítomné v deserializovaných datech. Ve výchozím nastavení je tento seznam omezen na:
- Primitiva a primitivní ekvivalenty:
bool
, ,char
,sbyte
byte
,short
,ushort
,int
,uint
, ,double
long
ulong
float
decimal
DateTime
DateTimeOffset
TimeSpan
string
Guid
SqlBinary
SqlBoolean
SqlByte
SqlBytes
SqlChars
SqlDateTime
SqlDecimal
SqlDouble
SqlGuid
SqlInt16
SqlInt32
SqlInt64
SqlMoney
SqlSingle
SqlString
- Běžně používané nemitivtivy:
Type
,Uri
aBigInteger
. - Běžně používané typy System.Drawing :
Color
,Point
,PointF
,Rectangle
,RectangleF
,Size
, aSizeF
. Enum
typy.- Pole a seznamy výše uvedených typů.
Pokud příchozí data XML obsahují objekt, jehož typ není v tomto seznamu:
Při následující zprávě a trasování zásobníku se vyvolá výjimka. Chybová zpráva: System.InvalidOperationException: Typ< Name>, Version=<n.n.n>, Culture=<culture>, PublicKeyToken=<token value> není zde povolen. Trasování zásobníku: v System.Data.TypeLimiter.EnsureTypeIsAllowed(Typ, TypeLimiter capturedLimiter) v System.Data.DataColumn.UpdateColumnType(Typ, Typ StorageType TypeCode) při System.Data.DataColumn.set_DataType(Hodnota typu)
Operace deserializace selže.
Při načítání XML do existující DataSet
instance nebo DataTable
instance se zohlední také definice existujících sloupců. Pokud tabulka již obsahuje definici sloupce vlastního typu, tento typ se dočasně přidá do seznamu povolených po dobu trvání operace deserializace XML.
Poznámka:
Jakmile přidáte sloupce do souboru DataTable
, ReadXml
nebude číst schéma z XML, a pokud schéma neodpovídá tomu, že nebude také číst v záznamech, takže budete muset přidat všechny sloupce sami pro použití této metody.
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
Omezení typu objektu platí také při použití XmlSerializer
k deserializaci instance DataSet
nebo DataTable
. Mohou však platit při použití BinaryFormatter
k deserializaci instance DataSet
nebo DataTable
.
Omezení typu objektu se nevztahují při použití , například při DataTable
naplnění DataAdapter.Fill
instance přímo z databáze bez použití rozhraní API deserializace XML.
Rozšíření seznamu povolených typů
Aplikace může seznam povolených typů rozšířit tak, aby zahrnoval vlastní typy kromě předdefinovaných typů uvedených výše. Pokud rozšiřujete seznam povolených typů, změna ovlivní všechny DataSet
instance a DataTable
instance v aplikaci. Z integrovaného seznamu povolených typů nelze odebrat typy.
Rozšíření konfigurace (.NET Framework 4.0 a novější)
App.config lze použít k rozšíření seznamu povolených typů. Rozšíření seznamu povolených typů:
- Pomocí elementu
<configSections>
přidejte odkaz na část Konfigurace System.Data . - Slouží
<system.data.dataset.serialization>
/<allowedTypes>
k zadání dalších typů.
Každý <add>
prvek musí zadat pouze jeden typ pomocí svého názvu kvalifikovaného typu sestavení. Pokud chcete do seznamu povolených typů přidat další typy, použijte více <add>
prvků.
Následující ukázka ukazuje rozšíření seznamu povolených typů přidáním vlastního typu Fabrikam.CustomType
.
<?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>
Chcete-li načíst kvalifikovaný název sestavení typu, použijte Type.AssemblyQualifiedName vlastnost, jak je znázorněno v následujícím kódu.
string assemblyQualifiedName = typeof(Fabrikam.CustomType).AssemblyQualifiedName;
Rozšíření konfigurace (.NET Framework 2.0 – 3.5)
Pokud vaše aplikace cílí na rozhraní .NET Framework 2.0 nebo 3.5, můžete stále použít výše uvedený mechanismus App.config k rozšíření seznamu povolených typů. Váš <configSections>
prvek se ale bude mírně lišit, jak je znázorněno v následujícím kódu:
<?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>
Rozšíření prostřednictvím kódu programu (.NET Framework, .NET Core, .NET 5+)
Seznam povolených typů lze také programově rozšířit pomocí AppDomain.SetData s dobře známým klíčem System.Data.DataSetDefaultAllowedTypes, jak je znázorněno v následujícím kódu.
Type[] extraAllowedTypes = new Type[]
{
typeof(Fabrikam.CustomType),
typeof(Contoso.AdditionalCustomType)
};
AppDomain.CurrentDomain.SetData("System.Data.DataSetDefaultAllowedTypes", extraAllowedTypes);
Pokud používáte mechanismus rozšíření, hodnota přidružená ke klíči System.Data.DataSetDefaultAllowedTypes musí být typu Type[]
.
V rozhraní .NET Framework může být seznam povolených typů rozšířen jak pomocí App.config , tak AppDomain.SetData
i . V tomto případě DataSet
a DataTable
umožní deserializovat objekt jako součást dat, pokud je jeho typ v některém seznamu.
Spuštění aplikace v režimu auditu (.NET Framework)
V rozhraní .NET Framework DataSet
a DataTable
poskytněte možnost režimu auditu. Pokud je povolen režim auditu a DataSet
DataTable
porovnejte typy příchozích objektů se seznamem povolených typů. Pokud je však zobrazen objekt, jehož typ není povolen, není vyvolán výjimka. Místo toho upozorněte všechny připojené TraceListener
instance, DataSet
že existuje podezřelý typ, což umožňuje TraceListener
protokolovat tyto DataTable
informace. Není vyvolána žádná výjimka a operace deserializace pokračuje.
Upozorňující
Spuštění aplikace v režimu auditování by mělo být jen dočasnou mírou používanou k testování. Pokud je režim auditu povolený DataSet
a DataTable
nevynucujte omezení typů, která můžou v aplikaci zavést bezpečnostní díru. Další informace najdete v částech s názvem Odebrání všech omezení typů a bezpečnosti s ohledem na nedůvěryhodný vstup.
Režim auditu je možné povolit prostřednictvím App.config:
- Informace o správné hodnotě
<configSections>
pro element naleznete v části Rozšíření prostřednictvím konfigurace v tomto dokumentu. - Slouží
<allowedTypes auditOnly="true">
k povolení režimu auditování, jak je znázorněno v následujícím kódu.
<?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>
Po povolení režimu auditu můžete pomocí App.config připojit preferovaný název předdefinovaného TraceSource.
DataSet
TraceListener
zdroje trasování System.Data.DataSet. Následující ukázka ukazuje zápis událostí trasování do konzoly a do souboru protokolu na disku.
<?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>
Další informace o TraceSource
a TraceListener
, naleznete v dokumentu Postupy: Použití TraceSource a filtry s naslouchacími procesy trasování.
Poznámka:
Spuštění aplikace v režimu auditování není k dispozici v .NET Core ani v .NET 5 a novějších verzích.
Odebrat všechna omezení typů
Pokud aplikace musí odebrat všechna omezení omezení typu z DataSet
a DataTable
:
- Existuje několik možností potlačení omezení typů.
- Dostupné možnosti závisí na rozhraní, na které cílí aplikace.
Upozorňující
Odebrání všech omezení typu může v aplikaci zavést bezpečnostní díru. Při použití tohoto mechanismu se ujistěte, že aplikace nepoužívá DataSet
nebo DataTable
čte nedůvěryhodný vstup. Další informace najdete v tématu CVE-2020-1147 a v následující části s názvem Bezpečnost s ohledem na nedůvěryhodný vstup.
Prostřednictvím konfigurace AppContext (.NET Framework 4.6 a novější, .NET Core 2.1 a novější, .NET 5 a novější)
Přepínač AppContext
, Switch.System.Data.AllowArbitraryDataSetTypeInstantiation
pokud je nastavena na true
odebrání všech omezení typů omezení z DataSet
a DataTable
.
V rozhraní .NET Framework lze tento přepínač povolit přes App.config, jak je znázorněno v následující konfiguraci:
<configuration>
<runtime>
<!-- Warning: setting the following switch can introduce a security problem. -->
<AppContextSwitchOverrides value="Switch.System.Data.AllowArbitraryDataSetTypeInstantiation=true" />
</runtime>
</configuration>
V ASP.NET <AppContextSwitchOverrides>
není prvek k dispozici. Místo toho lze přepínač povolit přes Web.config, jak je znázorněno v následující konfiguraci:
<configuration>
<appSettings>
<!-- Warning: setting the following switch can introduce a security problem. -->
<add key="AppContext.SetSwitch:Switch.System.Data.AllowArbitraryDataSetTypeInstantiation" value="true" />
</appSettings>
</configuration>
Další informace naleznete v <AppContextSwitchOverrides> element.
V .NET Core, .NET 5 a ASP.NET Core se toto nastavení řídí runtimeconfig.json, jak je znázorněno v následujícím kódu JSON:
{
"runtimeOptions": {
"configProperties": {
"Switch.System.Data.AllowArbitraryDataSetTypeInstantiation": true
}
}
}
Další informace najdete v tématu Nastavení konfigurace modulu runtime .NET Core.
AllowArbitraryDataSetTypeInstantiation
lze také nastavit programově prostřednictvím AppContext.SetSwitch místo použití konfiguračního souboru, jak je znázorněno v následujícím kódu:
// Warning: setting the following switch can introduce a security problem.
AppContext.SetSwitch("Switch.System.Data.AllowArbitraryDataSetTypeInstantiation", true);
Pokud zvolíte předchozí programový přístup, mělo by se volání AppContext.SetSwitch
objevit v rané fázi spouštění aplikací.
Prostřednictvím registru pro celý počítač (.NET Framework 2.0 – 4.x)
Pokud AppContext
není k dispozici, můžete pomocí registru Windows zakázat kontroly omezení typů:
- Správce musí nakonfigurovat registr.
- Použití registru je změna v celém počítači a ovlivní všechny aplikace spuštěné na počítači.
Typ | Hodnota |
---|---|
Klíč registru | HKLM\SOFTWARE\Microsoft\.NETFramework\AppContext |
Název hodnoty | Switch.System.Data.AllowArbitraryDataSetTypeInstantiation |
Typ hodnoty | REG_SZ |
Data hodnoty | true |
V 64bitovém operačním systému je potřeba tuto hodnotu přidat pro 64bitový klíč (uvedený výše) i 32bitový klíč. 32bitový klíč se nachází na HKLM\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\AppContext
adrese .
Další informace o použití registru ke konfiguraci AppContext
naleznete v tématu "AppContext pro uživatele knihovny".
Bezpečnost s ohledem na nedůvěryhodný vstup
Zatímco DataSet
a DataTable
platí výchozí omezení pro typy, které mohou být přítomny při deserializaci datových částí XML, DataSet
a DataTable
jsou obecně nebezpečené při naplnění nedůvěryhodným vstupem. Následuje seznam způsobů, jak DataSet
může nebo DataTable
instance číst nedůvěryhodný vstup.
DataAdapter
Odkazuje na databázi aDataAdapter.Fill
metoda se používá k naplněníDataSet
obsahem databázového dotazu.- Nebo
DataSet.ReadXml
DataTable.ReadXml
metoda slouží ke čtení souboru XML obsahujícího informace o sloupci a řádku. - Instance
DataSet
neboDataTable
instance je serializována jako součást webových služeb ASP.NET (SOAP) nebo koncového bodu WCF. - Serializátor, například
XmlSerializer
se používá k deserializaciDataSet
neboDataTable
instance z datového proudu XML. - Serializátor, například
JsonConvert
se používá k deserializaciDataSet
instance neboDataTable
instance z datového proudu JSON.JsonConvert
je metoda v oblíbené knihovně Newtonsoft.Json třetí strany. - Serializátor, například
BinaryFormatter
slouží k deserializaciDataSet
neboDataTable
instance z nezpracovaného bajtového datového proudu.
Tento dokument popisuje bezpečnostní aspekty pro předchozí scénáře.
Slouží DataAdapter.Fill
k naplnění DataSet
nedůvěryhodného zdroje dat.
Instanci DataSet
lze naplnit DataAdapter
pomocí DataAdapter.Fill
metody, jak je znázorněno v následujícím příkladu.
// 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");
(Výše uvedený vzorový kód je součástí většího vzorku nalezeného na adrese .Naplnění datové sady z objektu DataAdapter.)
Většina aplikací může zjednodušit a předpokládat, že jejich databázová vrstva je důvěryhodná. Pokud jste ale ve zvyku modelovat aplikace před hrozbami, model hrozeb může zvážit hranici důvěryhodnosti mezi aplikací (klient) a databázovou vrstvou (server). Použití vzájemného ověřování nebo ověřování AAD mezi klientem a serverem je jedním ze způsobů, jak vyřešit rizika spojená s tímto ověřováním. Zbývající část této části popisuje možný výsledek připojení klienta k nedůvěryhodnému serveru.
Důsledky nasměrování DataAdapter
na nedůvěryhodný zdroj dat závisí na implementaci samotného DataAdapter
zdroje dat.
SqlDataAdapter
U integrovaného typu SqlDataAdapter může odkazování na nedůvěryhodný zdroj dat vést k útoku dos (DoS). Útok DoS může vést k tomu, že aplikace přestane reagovat nebo dojde k chybovému ukončení. Pokud útočník může společně s aplikací vytvořit knihovnu DLL, může být také schopen dosáhnout místního spuštění kódu.
Jiné typy datovéhoadapteru
Implementace třetích stran DataAdapter
musí provádět vlastní posouzení toho, jaké záruky zabezpečení poskytují v tvář nedůvěryhodným vstupům. .NET nemůže zajistit žádné bezpečnostní záruky týkající se těchto implementací.
DataSet.ReadXml a DataTable.ReadXml
Metody DataSet.ReadXml
a DataTable.ReadXml
metody nejsou při použití s nedůvěryhodným vstupem bezpečné. Důrazně doporučujeme, aby spotřebitelé místo toho zvažovali použití jedné z alternativ popsaných dále v tomto dokumentu.
DataSet.ReadXml
Implementace a DataTable.ReadXml
byly původně vytvořeny před serializací ohrožení zabezpečení byly dobře pochopitelné kategorie hrozeb. V důsledku toho kód nedodržuje aktuální osvědčené postupy zabezpečení. Tato rozhraní API je možné použít jako vektory pro útočníky k provádění útoků DoS proti webovým aplikacím. Tyto útoky můžou způsobit, že webová služba nereaguje nebo způsobí neočekávané ukončení procesu. Architektura neposkytuje omezení rizik pro tyto kategorie útoků a .NET považuje toto chování za "podle návrhu".
Rozhraní .NET vydalo aktualizace zabezpečení, které zmírňují některé problémy, jako je zpřístupnění informací nebo vzdálené spuštění kódu a DataSet.ReadXml
DataTable.ReadXml
. Aktualizace zabezpečení .NET nemusí poskytovat úplnou ochranu proti těmto kategoriím hrozeb. Spotřebitelé by měli posoudit jednotlivé scénáře a zvážit jejich potenciální vystavení těmto rizikům.
Uživatelé by měli vědět, že aktualizace zabezpečení těchto rozhraní API můžou mít v některých situacích vliv na kompatibilitu aplikací. Kromě toho existuje možnost, že se v těchto rozhraních API zjistí nová ohrožení zabezpečení, pro které .NET nemůže prakticky publikovat aktualizaci zabezpečení.
Doporučujeme, aby uživatelé těchto rozhraní API:
- Zvažte použití jedné z alternativ popsaných dále v tomto dokumentu.
- Proveďte individuální posouzení rizik v aplikacích.
Je výhradní odpovědností spotřebitele určit, jestli se mají tato rozhraní API využívat. Spotřebitelé by měli posoudit veškerá bezpečnostní, technická a právní rizika, včetně zákonných požadavků, které mohou tato rozhraní API doprovázet.
DataSet a DataTable prostřednictvím webových služeb ASP.NET nebo WCF
Ve webové službě ASP.NET (SOAP) je možné přijmout DataSet
instanci DataTable
, jak je znázorněno v následujícím kódu:
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. */
}
}
Variantou není přijmout DataSet
ani DataTable
přímo jako parametr, ale místo toho ji přijmout jako součást celkového grafu serializovaného objektu SOAP, jak je znázorněno v následujícím kódu:
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; }
}
Nebo použití WCF místo ASP.NET webových služeb:
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; }
}
Ve všech těchto případech jsou záruky zabezpečení a modelu hrozeb stejné jako v části DataSet.ReadXml a DataTable.ReadXml.
Deserializace datové sady nebo datové tabulky prostřednictvím XmlSerializeru
Vývojáři můžou použít XmlSerializer
k deserializaci DataSet
a DataTable
instancím, jak je znázorněno v následujícím kódu:
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; }
}
V těchto případech jsou záruky zabezpečení a modelu hrozeb stejné jako v části DataSet.ReadXml a DataTable.ReadXml.
Deserializace datové sady nebo datové tabulky prostřednictvím JsonConvert
Oblíbenou knihovnu Newtonsoft třetích stran Json.NET lze použít k deserializaci DataSet
a DataTable
instancím, jak je znázorněno v následujícím kódu:
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; }
}
Deserializace objektu DataSet
blob JSON nebo DataTable
tímto způsobem z nedůvěryhodného objektu blob JSON není bezpečná. Tento model je zranitelný vůči útoku na dostupnost služby. Takový útok by mohl aplikaci zhroucet nebo ji znemožnit nereagující.
Poznámka:
Společnost Microsoft nezaručuje ani nepodporuje implementaci knihoven třetích stran, jako je Newtonsoft.Json. Tyto informace jsou poskytovány pro úplnost a jsou přesné v době psaní tohoto textu.
Deserializace datové sady nebo datové tabulky prostřednictvím BinaryFormatter
K deserializaci nebo instance z nedůvěryhodné datové části nesmíte nikdy použít BinaryFormatter
, SoapFormatter
NetDataContractSerializer
nebo související nebezpečné formátování:DataTable
DataSet
- To je náchylné k úplnému útoku na vzdálené spuštění kódu.
- Použití vlastního
SerializationBinder
objektu nestačí, aby se zabránilo takovému útoku.
Bezpečné náhrady
Pro aplikace, které:
- Přijměte
DataSet
neboDataTable
prostřednictvím koncového bodu SOAP .asmx nebo koncového bodu WCF. - Deserializovat nedůvěryhodná data do instance
DataSet
neboDataTable
.
Zvažte nahrazení objektového modelu pro použití Entity Frameworku. Entity Framework:
- Je bohatý, moderní objektově orientovaný rámec, který může představovat relační data.
- Přináší různorodý ekosystém poskytovatelů databází, aby bylo možné snadno projektovat databázové dotazy prostřednictvím vašich objektových modelů Entity Framework.
- Nabízí integrovanou ochranu při deserializaci dat z nedůvěryhodných zdrojů.
U aplikací, které používají .aspx
koncové body SOAP, zvažte změnu těchto koncových bodů tak, aby používaly WCF. WCF je plně funkční náhrada webových .asmx
služeb. Koncové body WCF je možné zpřístupnit prostřednictvím protokolu SOAP kvůli kompatibilitě se stávajícími volajícími.
Analyzátory kódu
Pravidla zabezpečení analyzátoru kódu, která se spouští při kompilaci zdrojového kódu, můžou pomoct najít ohrožení zabezpečení související s tímto problémem se zabezpečením v kódu C# a Visual Basicu. Microsoft.CodeAnalysis.FxCopAnalyzers je balíček NuGet analyzátorů kódu distribuovaných v nuget.org.
Přehled analyzátorů kódu najdete v tématu Přehled analyzátorů zdrojového kódu.
Povolte následující pravidla Microsoft.CodeAnalysis.FxCopAnalyzers:
- CA2350: Nepoužívejte DataTable.ReadXml() s nedůvěryhodnými daty
- CA2351: Nepoužívejte DataSet.ReadXml() s nedůvěryhodnými daty
- CA2352: Nebezpečné datové sady nebo datové tabulky v serializovatelném typu mohou být ohroženy útoky vzdáleného spuštění kódu
- CA2353: Nezabezpečená datová sada nebo datová tabulka v serializovatelném typu
- CA2354: Nebezpečné datové sady nebo datové tabulky v deserializovaném grafu objektů mohou být ohroženy útoky vzdáleného spuštění kódu
- CA2355: Nebezpečný typ DataSet nebo DataTable nalezený v deserializovatelném grafu objektu
- CA2356: Nezabezpečená datová sada nebo typ datové tabulky v grafu objektu s možností deserializovatelného webu
- CA2361: Ujistěte se, že se u nedůvěryhodných dat nepoužívá automaticky vygenerovaná třída obsahující DataSet.ReadXml().
- CA2362: Nebezpečná datová sada nebo datová tabulka v automaticky generovaném serializovatelném typu může být zranitelná vůči útokům vzdáleného spuštění kódu
Další informace o konfiguracipravidelch
Nová pravidla zabezpečení jsou k dispozici v následujících balíčcích NuGet:
- Microsoft.CodeAnalysis.FxCopAnalyzers 3.3.0: pro Visual Studio 2019 verze 16.3 nebo novější
- Microsoft.CodeAnalysis.FxCopAnalyzers 2.9.11: pro Visual Studio 2017 verze 15.9 nebo novější