Share via


CA3077: Osäker bearbetning i API-design, XML-dokument och XML-textläsare

Property Värde
Regel-ID CA3077
Rubrik Osäker bearbetning i API-design, XML-dokument och XML-textläsare
Kategori Säkerhet
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

När du utformar ett API som härletts från XMLDocument och XMLTextReader bör du tänka på DtdProcessing. Om du använder osäkra DTDProcessing-instanser när du refererar till eller löser externa entitetskällor eller anger osäkra värden i XML kan det leda till att information avslöjas.

Regelbeskrivning

En dokumenttypsdefinition (DTD) är ett av två sätt som en XML-parser kan fastställa giltigheten för ett dokument, enligt definitionen i World Wide Web Consortium (W3C) Extensible Markup Language (XML) 1.0. Den här regeln söker efter egenskaper och instanser där ej betrodda data accepteras för att varna utvecklare om potentiella informationsutlämnandehot, vilket kan leda till DoS-attacker (Denial of Service). Den här regeln utlöses när:

  • XmlDocument eller XmlTextReader klasser använder standardvärden för matchning för DTD-bearbetning .

  • Ingen konstruktor har definierats för xmldocument- eller XmlTextReader-härledda klasser eller så används inget säkert värde för XmlResolver.

Så här åtgärdar du överträdelser

  • Fånga och bearbeta alla XmlTextReader-undantag korrekt för att undvika att sökvägsinformation avslöjas .

  • Använd XmlSecureResolveri stället för XmlResolver för att begränsa de resurser som XmlTextReader kan komma åt.

När du ska ignorera varningar

Om du inte är säker på att indata är kända för att komma från en betrodd källa ska du inte utelämna en regel från den här varningen.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Exempel på pseudokod

Kränkning

using System;
using System.Xml;

namespace TestNamespace
{
    class TestClass : XmlDocument
    {
        public TestClass () {} // warn
    }

    class TestClass2 : XmlTextReader
    {
        public TestClass2() // warn
        {
        }
    }
}

Lösning

using System;
using System.Xml;

namespace TestNamespace
{
    class TestClass : XmlDocument
    {
        public TestClass ()
        {
            XmlResolver = null;
        }
    }

    class TestClass2 : XmlTextReader
    {
        public TestClass2()
        {
               XmlResolver = null;
        }
    }
}