Udostępnij za pośrednictwem


CA5369: Użyj elementu XmlReader do deserializacji

Właściwości Wartość
Identyfikator reguły CA5369
Tytuł Używaj elementu XmlReader do deserializacji
Kategoria Bezpieczeństwo
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 9 Nie.

Przyczyna

Deserializowanie niezaufanych danych wejściowych XmlSerializer.Deserialize XML z wystąpieniem XmlReader bez obiektu może potencjalnie prowadzić do odmowy usługi, ujawnienia informacji i ataków fałszerskich żądań po stronie serwera. Te ataki są włączane przez niezaufane przetwarzanie schematów DTD i XML, co umożliwia włączenie bomb XML i złośliwych jednostek zewnętrznych w formacie XML. Tylko w przypadku XmlReader , gdy można wyłączyć usługę DTD. Wbudowane przetwarzanie schematu XML ma XmlReader ProhibitDtd właściwość i ProcessInlineSchema ustawioną domyślnie false w programie .NET Framework w wersji 4.0 lub nowszej. Inne opcje, takie jak Stream, TextReaderi XmlSerializationReader nie mogą wyłączyć przetwarzania DTD.

Opis reguły

Przetwarzanie niezaufanych schematów DTD i XML może umożliwić ładowanie niebezpiecznych odwołań zewnętrznych, które powinny być ograniczone przy użyciu modułu XmlReader z bezpiecznym rozpoznawaniem lub z wyłączonym przetwarzaniem schematu wbudowanego DTD i XML. Ta reguła wykrywa kod, który używa XmlSerializer.Deserialize metody i nie przyjmuje XmlReader jako parametru konstruktora.

Jak naprawić naruszenia

Nie używaj XmlSerializer.Deserialize przeciążeń innych niż Deserialize(XmlReader), Deserialize(XmlReader, String), Deserialize(XmlReader, XmlDeserializationEvents)lub Deserialize(XmlReader, String, XmlDeserializationEvents).

Kiedy pomijać ostrzeżenia

To ostrzeżenie można potencjalnie pominąć, jeśli przeanalizowany kod XML pochodzi z zaufanego źródła i dlatego nie można go modyfikować.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykłady przykładów kodu przykładowego

Naruszenie

Poniższy przykład pseudo-kodu ilustruje wzorzec wykryty przez tę regułę. Typ pierwszego parametru XmlSerializer.Deserialize nie jest XmlReader lub jego klasa pochodna.

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

Rozwiązanie

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