Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA5369 |
| Tytuł | Użyj XmlReader do deserializacji |
| Kategoria | Bezpieczeństwo |
| Poprawka łamiąca lub nienaruszająca | Niezgodność |
| Domyślnie włączone na platformie .NET 10 | Nie. |
| Zastosowane języki | C# i Visual Basic |
Przyczyna
Deserializowanie niezaufanego wejścia XML przy użyciu XmlSerializer.Deserialize, gdy XmlReader nie jest obiektem, może potencjalnie prowadzić do odmowy usługi, ujawnienia danych oraz fałszerstwa żą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 z XmlReader można wyłączyć DTD. Domyślnie w wersji 4.0 i nowszych platformy .NET Framework, przetwarzanie wbudowanego schematu XML ma właściwości XmlReader oraz ProhibitDtd z ustawieniem ProcessInlineSchema na false. 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 XmlReader z bezpiecznym resolverem lub przy wyłączonym przetwarzaniu wbudowanych schematów 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 pseudokodu
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)));