CA5369: Použití XmlReader pro Deserializaci

Vlastnost Hodnota
ID pravidla CA5369
Název Použijte XmlReader pro deserializaci
Kategorie Zabezpečení
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

Příčina

Deserializace nedůvěryhodného vstupu XML s XmlSerializer.Deserialize instancí bez objektu XmlReader může potenciálně vést k útokům typu odepření služby, úniku informací a falšovaným požadavkům na straně serveru. Tyto útoky jsou povoleny nedůvěryhodným zpracováním schématU DTD a XML, což umožňuje zahrnutí bomb XML a škodlivých externích entit do XML. pouze s XmlReader je možné zakázat DTD. Vložené zpracování schématu XML, kde je vlastnost ProhibitDtd a ProcessInlineSchema nastavena na false ve výchozím nastavení v rozhraní .NET Framework verze 4.0 a novější. Další možnosti, jako Stream, TextReader a XmlSerializationReader, nezakážou zpracování DTD.

Popis pravidla

Zpracování nedůvěryhodných schémat DTD a XML může povolit načítání nebezpečných externích odkazů, které by mělo být omezeno pomocí zabezpečeného XmlReader překladače nebo se zakázaným zpracováním vloženého schématu DTD a XML. Toto pravidlo zjistí kód, který používá metodu XmlSerializer.Deserialize , a nebere XmlReader jako parametr konstruktoru.

Jak opravit porušení

Nepoužívejte XmlSerializer.Deserialize jiné přetížení než Deserialize(XmlReader), Deserialize(XmlReader, String), Deserialize(XmlReader, XmlDeserializationEvents)nebo Deserialize(XmlReader, String, XmlDeserializationEvents).

Kdy potlačit upozornění

Toto upozornění můžete potlačit, pokud analyzovaný kód XML pochází z důvěryhodného zdroje, a proto se s tím nedá manipulovat.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

#pragma warning disable CA5369
// The code that's violating the rule is on this line.
#pragma warning restore CA5369

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

[*.{cs,vb}]
dotnet_diagnostic.CA5369.severity = none

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklady pseudokódu

Porušení

Následující ukázka pseudokódu znázorňuje vzor zjištěný tímto pravidlem. Typ prvního parametru XmlSerializer.Deserialize není XmlReader nebo jeho odvozená třída.

using System.IO;
using System.Xml.Serialization;
...
new XmlSerializer(typeof(TestClass).Deserialize(new FileStream("filename", FileMode.Open));

Řešení

using System.IO;
using System.Xml;
using System.Xml.Serialization;
...
new XmlSerializer(typeof(TestClass)).Deserialize(XmlReader.Create (new FileStream("filename", FileMode.Open)));