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, sbytebyte, short, ushort, int, uint, , doublelongulongfloatdecimalDateTimeDateTimeOffsetTimeSpanstringGuidSqlBinarySqlBooleanSqlByteSqlBytesSqlCharsSqlDateTimeSqlDecimalSqlDoubleSqlGuidSqlInt16SqlInt32SqlInt64SqlMoneySqlSingleSqlString
  • Běžně používané nemitivtivy: Type, Uria BigInteger.
  • Běžně používané typy System.Drawing : Color, Point, PointF, Rectangle, RectangleF, Size, a SizeF.
  • 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.Fillinstance 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šechnyDataSet 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.SetDatai . 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 DataSetDataTable 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 Sejf ty s ohledem na nedůvěryhodný vstup.

Režim auditu je možné povolit prostřednictvím App.config:

<?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.DataSetTraceListener 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 Sejf ty 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.AllowArbitraryDataSetTypeInstantiationpokud 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\AppContextadrese .

Další informace o použití registru ke konfiguraci AppContextnaleznete v tématu "AppContext pro uživatele knihovny".

Sejf ty 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 a DataAdapter.Fill metoda se používá k naplnění DataSet obsahem databázového dotazu.
  • Nebo DataSet.ReadXmlDataTable.ReadXml metoda slouží ke čtení souboru XML obsahujícího informace o sloupci a řádku.
  • Instance DataSet nebo DataTable 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 deserializaci DataSet nebo DataTable instance z datového proudu XML.
  • Serializátor, například JsonConvert se používá k deserializaci DataSet instance nebo DataTable instance z datového proudu JSON. JsonConvertje metoda v oblíbené knihovně Newtonsoft.Json třetí strany.
  • Serializátor, například BinaryFormatter slouží k deserializaci DataSet nebo DataTable 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.ReadXmlDataTable.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, SoapFormatterNetDataContractSerializernebo související nebezpečné formátování:DataTableDataSet

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

nahrazení Sejf

Pro aplikace, které:

  • Přijměte DataSet nebo DataTable prostřednictvím koncového bodu SOAP .asmx nebo koncového bodu WCF.
  • Deserializovat nedůvěryhodná data do instance DataSet nebo DataTable.

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ší