Megosztás a következőn keresztül:


DataSet és DataTable biztonsági útmutató

Ez a cikk a következőkre vonatkozik:

  • .NET-keretrendszer (minden verzió)
  • .NET Core és újabb verziók
  • .NET 5 és újabb verziók

Az Adatkészlet és a DataTable típusok régi .NET-összetevők, amelyek lehetővé teszik az adathalmazok felügyelt objektumként való ábrázolását. Ezeket az összetevőket az .NET-keretrendszer 1.0-s verziójában vezették be az eredeti ADO.NET infrastruktúra részeként. Céljuk egy relációs adatkészlet felügyelt nézetének biztosítása volt, amely absztrakciót biztosít arról, hogy az adatok mögöttes forrása XML, SQL vagy más technológia volt-e.

A ADO.NET, beleértve a modernebb adatnézeti paradigmákat is, a ADO.NET dokumentációjában talál további információt.

Alapértelmezett korlátozások adathalmaz vagy adattábla XML-ből való deszerializálásakor

A .NET-keretrendszer, a .NET Core és a .NET DataSetDataTable összes támogatott verzióján az alábbi korlátozásokat alkalmazhatja arra, hogy milyen típusú objektumok lehetnek jelen a deszerializált adatokban. Ez a lista alapértelmezés szerint a következőre korlátozódik:

  • Primitívek és primitív megfelelők: bool, char, sbyte, byte, short, ushortint, floatdoubleDateTimeOffsetDateTimedecimalTimeSpanulonglonguintstringGuidSqlDateTimeSqlCharsSqlDecimalSqlBytesSqlDoubleSqlByteSqlGuidSqlInt16SqlBooleanSqlBinarySqlInt64SqlMoneySqlInt32SqlSingleés .SqlString
  • Gyakran használt nem primitívek: Type, Uriés BigInteger.
  • Gyakran használt System.Drawing-típusok : Color, Point, PointF, Rectangle, RectangleF, Sizeés SizeF.
  • Enum Típusok.
  • A fenti típusok tömbjei és listái.

Ha a bejövő XML-adatok olyan objektumot tartalmaznak, amelynek típusa nem szerepel a listában:

  • A rendszer kivételt jelez a következő üzenettel és veremkövetéssel. Hibaüzenet: System.InvalidOperationException: Itt nem engedélyezett a "<Típus neve>, Version=<n.n.n.n.n>, Culture=<culture>, PublicKeyToken=<token value>" típus. Stack Trace: at System.Data.TypeLimiter.EnsureTypeIsAllowed(Type type, TypeLimiter capturedLimiter) at System.Data.DataColumn.UpdateColumnType(Type type, StorageType typeCode) at System.Data.DataColumn.set_DataType(Type value)

  • A deszerializálási művelet meghiúsul.

Ha XML-t tölt be egy meglévőbe DataSet vagy DataTable példányba, a rendszer figyelembe veszi a meglévő oszlopdefiníciókat is. Ha a tábla már tartalmaz egy egyéni típus oszlopdefinícióját, a rendszer ideiglenesen hozzáadja ezt a típust az xml-deszerializálási művelet időtartamára az engedélyezési listához.

Feljegyzés

Ha oszlopokat ad hozzá egy DataTablefájlhoz, ReadXml nem fogja beolvasni a sémát az XML-fájlból, és ha a séma nem egyezik meg, akkor az sem lesz beolvasva a rekordokban, ezért a metódus használatához saját maga kell hozzáadnia az összes oszlopot.

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

Az objektumtípus-korlátozások akkor is érvényesek, ha egy példány vagy DataTablepéldány deszerializálására DataSet használjákXmlSerializer. Előfordulhat azonban, hogy nem alkalmazhatók a példányok vagy példányok deszerializálásáraDataTableDataSet.BinaryFormatter

Az objektumtípus-korlátozások nem vonatkoznak a használatukra DataAdapter.Fill, például ha egy DataTable példányt közvetlenül egy adatbázisból tölt fel az XML-deszerializálási API-k használata nélkül.

Az engedélyezett típusok listájának kiterjesztése

Az alkalmazások kiterjeszthetik az engedélyezett típusok listáját úgy, hogy a fent felsorolt beépített típusok mellett egyéni típusokat is tartalmazzanak. Ha kibővíti az engedélyezett típusok listáját, a módosítás az alkalmazáson belüli összesDataSet példányra és DataTable példányra hatással van. A típusok nem távolíthatók el a beépített engedélyezett típusok listájából.

Kiterjeszthető konfiguráció (.NET-keretrendszer 4.0-s és újabb verziók)

Az App.config az engedélyezett típusok listájának kibővítésére használható. Az engedélyezett típusok listájának kiterjesztése:

  • <configSections> Az elem használatával adjon hozzá egy hivatkozást a System.Data konfigurációs szakaszhoz.
  • További típusok megadására használható <system.data.dataset.serialization>/<allowedTypes> .

Minden <add> elemnek csak egy típust kell megadnia a szerelvény minősített típusnevének használatával. Ha további típusokat szeretne hozzáadni az engedélyezett típusok listájához, használjon több <add> elemet.

Az alábbi minta az engedélyezett típusok listájának kiterjesztését mutatja be az egyéni típus Fabrikam.CustomTypehozzáadásával.

<?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>

Egy típus szerelvény-minősített nevének lekéréséhez használja a Type.AssemblyQualifiedName tulajdonságot, ahogyan az az alábbi kódban is látható.

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

Kiterjeszthető konfiguráció (.NET-keretrendszer 2.0 – 3.5)

Ha az alkalmazás a 2.0-s vagy a 3.5-ös .NET-keretrendszer célozza meg, akkor is használhatja a fenti App.config mechanizmust az engedélyezett típusok listájának kiterjesztéséhez. Az <configSections> elem azonban kissé eltérően fog kinézni, ahogy az a következő kódban is látható:

<?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>

Programozott kiterjesztés (.NET-keretrendszer, .NET Core, .NET 5+)

Az engedélyezett típusok listája programozott módon is bővíthető az AppDomain.SetData és a jól ismert System.Data.DataSetDefaultAllowedTypes kulcs használatával, ahogyan az az alábbi kódban is látható.

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

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

A bővítménymechanizmus használata esetén a System.Data.DataSetDefaultAllowedTypes kulcshoz társított értéknek típusnak Type[]kell lennie.

A .NET-keretrendszer az engedélyezett típusok listája az App.config és AppDomain.SetDataa . Ebben az esetben, DataSet és DataTable lehetővé teszi egy objektum deszerializálását az adatok részeként, ha a típus bármelyik listában szerepel.

Alkalmazás futtatása naplózási módban (.NET-keretrendszer)

A .NET-keretrendszer, DataSet és DataTable adjon meg egy naplózási módot. Ha a naplózási mód engedélyezve van, DataSet és DataTable hasonlítsa össze a bejövő objektumok típusait az engedélyezett típusok listájával. Ha azonban egy olyan objektum látható, amelynek a típusa nem engedélyezett, a rendszer nem ad kivételt. DataSetDataTable Ehelyett értesítse a csatolt TraceListener példányokat arról, hogy gyanús típus van jelen, lehetővé téve az TraceListener adatok naplózását. Nincs kivétel, és a deszerializálási művelet folytatódik.

Figyelmeztetés

Az alkalmazás "naplózási módban" való futtatása csak a teszteléshez használt ideiglenes mérték lehet. Ha a naplózási mód engedélyezve van, DataSet és DataTable nem kényszeríti ki a típuskorlátozásokat, ami biztonsági rést okozhat az alkalmazásban. További információ: Az összes típuskorlátozás és Széf ty eltávolítása a nem megbízható bemenetekkel kapcsolatban.

A naplózási mód az App.config használatával engedélyezhető:

  • Az elem megfelelő értékével kapcsolatos információkért tekintse meg a dokumentum Konfiguráción keresztül című szakaszát <configSections> .
  • A naplózási mód engedélyezésére szolgál <allowedTypes auditOnly="true"> az alábbi korrektúra szerint.
<?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>

Ha a naplózási mód engedélyezve van, az App.config használatával csatlakoztathatja az előnyben TraceSource. részesítettt TraceListener a DataSet beépített nyomkövetési forrás nevéhez: System.Data.DataSet. Az alábbi minta bemutatja a nyomkövetési eseményeknek a konzolra és egy lemezen lévő naplófájlba való írását.

<?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>

További információkért TraceSourceTraceListenerés a nyomkövetési figyelőkkel kapcsolatos további információkért tekintse meg a következő dokumentumot : A TraceSource és a szűrők használata nyomkövetésfigyelőkkel.

Feljegyzés

Az alkalmazás naplózási módban való futtatása nem érhető el a .NET Core-ban, illetve a .NET 5-ös és újabb verzióiban.

Az összes típuskorlátozás eltávolítása

Ha egy alkalmazásnak el kell távolítania az összes típuskorlátozó korlátozást a következőbőlDataSet:DataTable

  • Számos lehetőség van a típuskorlátozások letiltására.
  • Az elérhető lehetőségek az alkalmazás céljainak keretrendszerétől függenek.

Figyelmeztetés

Az összes típuskorlátozás eltávolítása biztonsági rést okozhat az alkalmazásban. Ha ezt a mechanizmust használja, győződjön meg arról, hogy az alkalmazás nem használja DataSet vagy DataTable nem megbízható bemenetet olvas be. További információ: CVE-2020-1147 és a következő, Széf ty című szakasz a nem megbízható bemenetekkel kapcsolatban.

AppContext-konfiguráción keresztül (.NET-keretrendszer 4.6-os és újabb, .NET Core 2.1 és újabb, .NET 5-ös és újabb)

A AppContext kapcsoló, Switch.System.Data.AllowArbitraryDataSetTypeInstantiationha be van állítva, hogy eltávolítsa az true összes típuskorlátozó korlátozást az és DataTablea DataSet .

A .NET-keretrendszer ez a kapcsoló az App.config használatával engedélyezhető, ahogyan az alábbi konfigurációban látható:

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

A ASP.NET az <AppContextSwitchOverrides> elem nem érhető el. Ehelyett a kapcsoló a Web.config használatával engedélyezhető, ahogyan az a következő konfigurációban is látható:

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

További információ: <AppContextSwitchOverrides> elem.

A .NET Core, a .NET 5 és a ASP.NET Core esetén ezt a beállítást a runtimeconfig.json vezérli, ahogyan az alábbi JSON-ban is látható:

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

További információ: ".NET Core futtatókörnyezet konfigurációs beállításai".

AllowArbitraryDataSetTypeInstantiationAz AppContext.SetSwitch programozott módon is beállítható konfigurációs fájl használata helyett, ahogyan az a következő kódban látható:

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

Ha az előző programozott megközelítést választja, a hívásnak AppContext.SetSwitch az alkalmazások indítási szakaszában kell történnie.

A gépszintű beállításjegyzéken keresztül (.NET-keretrendszer 2.0 - 4.x)

Ha AppContext nem érhető el, a típuskorlátozó ellenőrzések letilthatók a Windows beállításjegyzékében:

  • A rendszergazdának konfigurálnia kell a beállításjegyzéket.
  • A beállításjegyzék használata egy gépre kiterjedő változás, amely hatással lesz a gépen futó összes alkalmazásra.
Típus Érték
Beállításkulcs HKLM\SOFTWARE\Microsoft\.NETFramework\AppContext
Érték neve Switch.System.Data.AllowArbitraryDataSetTypeInstantiation
Érték típusa REG_SZ
Értékadatok true

Egy 64 bites operációs rendszeren ezt az értéket a 64 bites (fent látható) és a 32 bites kulcshoz is hozzá kell adnom. A 32 bites kulcs a következő helyen található: HKLM\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\AppContext.

A beállításjegyzék konfigurálására AppContextvonatkozó további információkért lásd: "AppContext a kódtár felhasználói számára".

Széf a nem megbízható bemenetek tekintetében

DataTable Az DataSet XML-hasznos adatok deszerializálása során engedélyezett típusokra vonatkozó alapértelmezett korlátozásokat kell bevezetni,DataSetés DataTable általában nem biztonságosak, ha nem megbízható bemenettel vannak feltöltve. Az alábbiakban nem teljes listát olvashat arról, hogy egy DataSet vagy DataTable egy példány hogyan olvashatja a nem megbízható bemeneteket.

  • Egy DataAdapter adatbázisra hivatkozik, és a DataAdapter.Fill metódus egy adatbázis-lekérdezés tartalmával való feltöltésére DataSet szolgál.
  • A DataSet.ReadXml vagy DataTable.ReadXml metódus egy oszlop- és sorinformációkat tartalmazó XML-fájl olvasására szolgál.
  • Egy DataSet vagy DataTable több példány szerializálva van egy ASP.NET (SOAP) webszolgáltatás vagy WCF-végpont részeként.
  • Egy szerializáló, például XmlSerializer egy XML-adatfolyamból származó példány vagy DataTable példány deszerializálására DataSet szolgál.
  • Egy szerializáló, például JsonConvert egy példány vagy DataTable egy DataSet JSON-streamből való deszerializálására szolgál. JsonConvert egy módszer a népszerű külső Newtonsoft.Json könyvtárban.
  • Egy szerializáló, például BinaryFormatter egy nyers bájtfolyamból származó példány vagy DataTable példány deszerializálására DataSet szolgál.

Ez a dokumentum az előző forgatókönyvek biztonsági szempontjait ismerteti.

Nem DataAdapter.Fill megbízható adatforrásból származó adatok feltöltése DataSet

A DataSet példányok a metódus használatával DataAdapter.Fill tölthetők kiDataAdapter, ahogyan az alábbi példában is látható.

// 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");

(A fenti kódminta egy nagyobb minta része, amely a következő helyen található: Adathalmaz feltöltése DataAdapterből.)

A legtöbb alkalmazás leegyszerűsítheti és feltételezheti, hogy az adatbázisréteg megbízható. Ha azonban az alkalmazások fenyegetésmodellezésének szokása, a fenyegetésmodell úgy tekintheti, hogy az alkalmazás (ügyfél) és az adatbázisréteg (kiszolgáló) között megbízhatósági határ van. Az ügyfél és a kiszolgáló közötti kölcsönös hitelesítés vagy AAD-hitelesítés az egyik módja annak, hogy elhárítsa az ezzel járó kockázatokat. A szakasz további része a nem megbízható kiszolgálóhoz csatlakozó ügyfél lehetséges eredményét ismerteti.

A nem megbízható adatforrásokra való rámutatás DataAdapter következményei az adott adatforrás megvalósításától függenek DataAdapter .

SqlDataAdapter

A beépített SqlDataAdapter típus esetén a nem megbízható adatforrásokra való hivatkozás szolgáltatásmegtagadási (DoS-) támadást eredményezhet. A DoS-támadás azt eredményezheti, hogy az alkalmazás nem válaszol vagy összeomlik. Ha a támadó egy DLL-t helyezhet el az alkalmazás mellett, akkor helyi kódvégrehajtást is elérhet.

Egyéb DataAdapter-típusok

A DataAdapter külső implementációknak saját értékelést kell készíteniük arról, hogy milyen biztonsági garanciákat nyújtanak a nem megbízható bemenetekkel szemben. A .NET nem tud biztonsági garanciákat biztosítani ezekre a megvalósításokra vonatkozóan.

DataSet.ReadXml és DataTable.ReadXml

A DataSet.ReadXml metódusok és DataTable.ReadXml a metódusok nem biztonságosak, ha nem megbízható bemenettel használják őket. Határozottan javasoljuk, hogy a fogyasztók inkább a dokumentum későbbi részében ismertetett alternatívák egyikét használják.

A szerializálási biztonsági rések implementációi DataSet.ReadXml és DataTable.ReadXml eredetileg a szerializálási biztonsági rések jól érthető fenyegetéskategóriák voltak. Ennek eredményeképpen a kód nem követi az aktuális biztonsági ajánlott eljárásokat. Ezek az API-k vektorként használhatók a támadók számára a webalkalmazások elleni DoS-támadások végrehajtásához. Ezek a támadások a webszolgáltatást nem válaszolhatják meg, vagy váratlan folyamatleállást eredményezhetnek. A keretrendszer nem nyújt kockázatcsökkentést ezekhez a támadási kategóriákhoz, és a .NET ezt a viselkedést "terv szerint" tekinti.

A .NET biztonsági frissítéseket adott ki, hogy elhárítsa az olyan problémákat, mint például az információfelfedés vagy a távoli kódvégrehajtásDataSet.ReadXml.DataTable.ReadXml Előfordulhat, hogy a .NET biztonsági frissítései nem nyújtanak teljes védelmet ezek ellen a fenyegetéskategóriák ellen. A fogyasztóknak fel kell mérniük az egyéni forgatókönyveiket, és figyelembe kell venniük az ilyen kockázatoknak való kitettségüket.

A felhasználóknak tisztában kell lenniük azzal, hogy bizonyos esetekben az API-k biztonsági frissítései hatással lehetnek az alkalmazások kompatibilitására. Emellett fennáll annak a lehetősége, hogy új biztonsági rést fedeznek fel ezekben az API-kban, amelyek esetében a .NET gyakorlatilag nem tud biztonsági frissítést közzétenni.

Javasoljuk, hogy az alábbi API-k felhasználói a következők:

  • Fontolja meg a dokumentum későbbi részében ismertetett alternatívák egyikének használatát.
  • Egyéni kockázatértékeléseket végezhet az alkalmazásaikon.

A fogyasztó kizárólagos felelőssége annak meghatározása, hogy ezeket az API-kat használja-e. A fogyasztóknak fel kell mérniük az ezen API-k használatát kísérő biztonsági, műszaki és jogi kockázatokat, beleértve a szabályozási követelményeket is.

DataSet és DataTable ASP.NET webszolgáltatásokon vagy WCF-en keresztül

Egy ASP.NET (SOAP) webszolgáltatásban elfogadhat egy DataSet vagy egy DataTable példányt, ahogyan az a következő kódban is látható:

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. */
    }
}

Ennek egyik változata nem paraméterként vagy DataTable közvetlenül, DataSet hanem az általános SOAP szerializált objektumgráf részeként való elfogadása, ahogyan az a következő kódban látható:

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; }
}

Vagy a WCF használata ASP.NET webszolgáltatások helyett:

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; }
}

Ezekben az esetekben a fenyegetésmodell és a biztonsági garanciák megegyeznek a DataSet.ReadXml és a DataTable.ReadXml szakaszával.

DataSet vagy DataTable deszerializálása XmlSerializer használatával

A fejlesztők a XmlSerializer következő kódban látható módon deszerializálhatnak és DataTable példányokat deszerializálhatnakDataSet:

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; }
}

Ezekben az esetekben a fenyegetésmodell és a biztonsági garanciák megegyeznek a DataSet.ReadXml és a DataTable.ReadXml szakaszával

Adathalmaz vagy adattábla deszerializálása A JsonConvert használatával

A népszerű külső Newtonsoft-kódtár Json.NET használható deszerializálásra DataSet és DataTable példányok létrehozására, ahogyan az alábbi kódban látható:

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; }
}

A nem megbízható JSON-blobból származó vagy DataTable ilyen módon történő deszerializálás DataSet nem biztonságos. Ez a minta sebezhető a szolgáltatásmegtagadási támadással szemben. Egy ilyen támadás összeomlást okozhat az alkalmazáson, vagy nem válaszolhat.

Feljegyzés

A Microsoft nem garantálja vagy támogatja az olyan külső kódtárak implementálását, mint a Newtonsoft.Json. Ezek az információk a teljesség érdekében rendelkezésre áll, és pontosak az írás időpontjától.

Adathalmaz vagy adattábla deszerializálása BinaryFormatter használatával

Soha ne használjon BinaryFormatter, , NetDataContractSerializer, SoapFormattervagy kapcsolódó nem biztonságos formázókat egy DataSet vagy DataTable több példány nem megbízható hasznos adatból való deszerializálásához:

  • Ez egy teljes távoli kódvégrehajtási támadásra érzékeny.
  • A custom SerializationBinder használata nem elegendő az ilyen támadások megelőzéséhez.

Széf csere

Olyan alkalmazások esetén, amelyek a következők:

  • .asmx SOAP-végpont vagy DataTable WCF-végpont elfogadása DataSet vagy keresztül.
  • Deszerializálja a nem megbízható adatokat egy példányban DataSet vagy DataTable.

Érdemes lehet lecserélni az objektummodellt az Entity Framework használatára. Entitás-keretrendszer:

  • Egy gazdag, modern, objektumorientált keretrendszer, amely relációs adatokat képes képviselni.
  • Az adatbázis-szolgáltatók változatos ökoszisztémáját hozza létre, hogy az Entity Framework-objektummodellekkel egyszerűen kivetíthesse az adatbázis-lekérdezéseket.
  • Beépített védelmet nyújt a nem megbízható forrásokból származó adatok deszerializálása során.

A SOAP-végpontokat használó .aspx alkalmazások esetében érdemes lehet módosítani ezeket a végpontokat a WCF használatára. A WCF a webszolgáltatások teljesebb funkcionalitású helyettesítése .asmx . A WCF-végpontok a SOAP használatával tehetők közzé a meglévő hívókkal való kompatibilitás érdekében.

Kódelemzők

A kódelemző biztonsági szabályai, amelyek a forráskód fordításakor futnak, segíthetnek megtalálni a biztonsági problémával kapcsolatos biztonsági réseket a C# és a Visual Basic kódban. A Microsoft.CodeAnalysis.FxCopAnalyzers egy NuGet-kódelemző csomag, amely nuget.org van elosztva.

A kódelemzők áttekintéséhez tekintse meg a forráskódelemzők áttekintését.

Engedélyezze a következő Microsoft.CodeAnalysis.FxCopAnalyzers szabályokat:

  • CA2350: Ne használja a DataTable.ReadXml() nem megbízható adatokat
  • CA2351: Ne használja a DataSet.ReadXml() függvényt nem megbízható adatokkal
  • CA2352: A nem biztonságos adathalmaz vagy a szerializálható típusú DataTable sebezhető lehet a távoli kódvégrehajtási támadásokkal szemben
  • CA2353: Nem biztonságos dataSet vagy DataTable szerializálható típusban
  • CA2354: A deszerializált objektumdiagram nem biztonságos adathalmaza vagy Adattáblája sebezhető lehet a távoli kódvégrehajtási támadásokkal szemben
  • CA2355: Nem biztonságos adathalmaz vagy adattáblatípus található a deszerializálható objektumgráfban
  • CA2356: Nem biztonságos adathalmaz vagy adattáblatípus webes deszerializálható objektumgráfban
  • CA2361: Győződjön meg arról, hogy a DataSet.ReadXml() tulajdonságot tartalmazó automatikusan létrehozott osztály nem használható nem megbízható adatokkal
  • CA2362: A nem biztonságos adathalmaz vagy az automatikusan szerializálható típusú DataTable sebezhető lehet a távoli kódvégrehajtási támadásokkal szemben

A szabályok konfigurálásáról további információt a Kódelemzők használata című témakörben talál.

Az új biztonsági szabályok a következő NuGet-csomagokban érhetők el:

  • Microsoft.CodeAnalysis.FxCopAnalyzers 3.3.0: a Visual Studio 2019 16.3-os vagy újabb verziójához
  • Microsoft.CodeAnalysis.FxCopAnalyzers 2.9.11: a Visual Studio 2017 15.9-es vagy újabb verziójához