CA3075: Elaborazione DTD non protetta
Proprietà | valore |
---|---|
ID regola | CA3075 |
Title | Elaborazione DTD non protetta |
Categoria | Sicurezza |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | No |
Causa
Se si usano istanze di DtdProcessing non protette o si fa riferimento a origini di entità esterne, il parser può accettare un input non attendibile e divulgare informazioni riservate a utenti malintenzionati.
Descrizione regola
La definizione DTD (Document Type Definition) rappresenta uno dei due modi in cui un parser XML può determinare la validità di un documento, come definito dalla raccomandazione W3C (World Wide Web Consortium) Extensible Markup Language (XML) 1.0. Questa regola cerca proprietà e istanze in cui i dati non attendibili vengono accettati per avvisare gli sviluppatori di potenziali minacce alla divulgazione di informazioni o attacchi Denial of Service (DoS). Questa regola viene attivata quando:
DtdProcessing viene abilitato nell'istanza di XmlReader , che risolve le entità XML esterne con XmlUrlResolver.
La proprietà InnerXml nel codice XML è impostata.
DtdProcessing la proprietà è impostata su Parse.
Un input non attendibile viene elaborato con XmlResolver anziché con XmlSecureResolver .
Il XmlReader.Create metodo viene richiamato con un'istanza non sicura XmlReaderSettings o nessuna istanza.
XmlReader viene creato con impostazioni o valori predefiniti non sicuri.
In ognuno di questi casi, il risultato è lo stesso: il contenuto del file system o delle condivisioni di rete dal computer in cui viene elaborato il codice XML verrà esposto all'utente malintenzionato o l'elaborazione DTD può essere usata come vettore DoS.
Come correggere le violazioni
Intercettare ed elaborare correttamente tutte le eccezioni XmlTextReader per evitare la divulgazione di informazioni sul percorso.
Usare l'oggetto XmlSecureResolver per limitare le risorse a cui può accedere XmlTextReader.
Non consentire all'oggetto XmlReader di aprire risorse esterne impostando la proprietà XmlResolver su Null.
Assicurarsi che la DataViewManager.DataViewSettingCollectionString proprietà sia assegnata da un'origine attendibile.
.NET Framework 3.5 e versioni precedenti
Disabilitare l'elaborazione DTD se si usano origini non attendibili impostando la proprietà ProhibitDtd su true .
La classe XmlTextReader ha una richiesta di ereditarietà con attendibilità totale.
.NET Framework 4 e versioni successive
Evitare di abilitare DtdProcessing se si gestiscono origini non attendibili impostando la XmlReaderSettings.DtdProcessing proprietà su Proibisci o Ignora.
Assicurarsi che il metodo Load() accetti un'istanza di XmlReader ovunque venga usato InnerXml.
Nota
Questa regola potrebbe segnalare dei falsi positivi in alcune istanze valide di XmlSecureResolver.
Quando eliminare gli avvisi
A meno che non si abbia la certezza che l'input provenga da un'origine attendibile, non escludere una regola da questo avviso.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA3075
// The code that's violating the rule is on this line.
#pragma warning restore CA3075
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none
su nel file di configurazione.
[*.{cs,vb}]
dotnet_diagnostic.CA3075.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.
Esempi di pseudo-codice
Violazione 1
using System.IO;
using System.Xml.Schema;
class TestClass
{
public XmlSchema Test
{
get
{
var src = "";
TextReader tr = new StreamReader(src);
XmlSchema schema = XmlSchema.Read(tr, null); // warn
return schema;
}
}
}
Soluzione 1
using System.IO;
using System.Xml;
using System.Xml.Schema;
class TestClass
{
public XmlSchema Test
{
get
{
var src = "";
TextReader tr = new StreamReader(src);
XmlReader reader = XmlReader.Create(tr, new XmlReaderSettings() { XmlResolver = null });
XmlSchema schema = XmlSchema.Read(reader , null);
return schema;
}
}
}
Violazione 2
using System.Xml;
namespace TestNamespace
{
public class TestClass
{
public XmlReaderSettings settings = new XmlReaderSettings();
public void TestMethod(string path)
{
var reader = XmlReader.Create(path, settings); // warn
}
}
}
Soluzione 2
using System.Xml;
namespace TestNamespace
{
public class TestClass
{
public XmlReaderSettings settings = new XmlReaderSettings()
{
DtdProcessing = DtdProcessing.Prohibit
};
public void TestMethod(string path)
{
var reader = XmlReader.Create(path, settings);
}
}
}
Violazione 3
using System.Xml;
namespace TestNamespace
{
public class DoNotUseSetInnerXml
{
public void TestMethod(string xml)
{
XmlDocument doc = new XmlDocument() { XmlResolver = null };
doc.InnerXml = xml; // warn
}
}
}
using System.Xml;
namespace TestNamespace
{
public class DoNotUseLoadXml
{
public void TestMethod(string xml)
{
XmlDocument doc = new XmlDocument(){ XmlResolver = null };
doc.LoadXml(xml); // warn
}
}
}
Soluzione 3
using System.Xml;
public static void TestMethod(string xml)
{
XmlDocument doc = new XmlDocument() { XmlResolver = null };
System.IO.StringReader sreader = new System.IO.StringReader(xml);
XmlReader reader = XmlReader.Create(sreader, new XmlReaderSettings() { XmlResolver = null });
doc.Load(reader);
}
Violazione 4
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace TestNamespace
{
public class UseXmlReaderForDeserialize
{
public void TestMethod(Stream stream)
{
XmlSerializer serializer = new XmlSerializer(typeof(UseXmlReaderForDeserialize));
serializer.Deserialize(stream); // warn
}
}
}
Soluzione 4
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace TestNamespace
{
public class UseXmlReaderForDeserialize
{
public void TestMethod(Stream stream)
{
XmlSerializer serializer = new XmlSerializer(typeof(UseXmlReaderForDeserialize));
XmlReader reader = XmlReader.Create(stream, new XmlReaderSettings() { XmlResolver = null });
serializer.Deserialize(reader );
}
}
}
Violazione 5
using System.Xml;
using System.Xml.XPath;
namespace TestNamespace
{
public class UseXmlReaderForXPathDocument
{
public void TestMethod(string path)
{
XPathDocument doc = new XPathDocument(path); // warn
}
}
}
Soluzione 5
using System.Xml;
using System.Xml.XPath;
namespace TestNamespace
{
public class UseXmlReaderForXPathDocument
{
public void TestMethod(string path)
{
XmlReader reader = XmlReader.Create(path, new XmlReaderSettings() { XmlResolver = null });
XPathDocument doc = new XPathDocument(reader);
}
}
}
Violazione 6
using System.Xml;
namespace TestNamespace
{
class TestClass
{
public XmlDocument doc = new XmlDocument() { XmlResolver = new XmlUrlResolver() };
}
}
Soluzione 6
using System.Xml;
namespace TestNamespace
{
class TestClass
{
public XmlDocument doc = new XmlDocument() { XmlResolver = null }; // or set to a XmlSecureResolver instance
}
}
Violazione 7
using System.Xml;
namespace TestNamespace
{
class TestClass
{
private static void TestMethod()
{
var reader = XmlTextReader.Create(""doc.xml""); //warn
}
}
}
using System.Xml;
namespace TestNamespace
{
public class TestClass
{
public void TestMethod(string path)
{
try {
XmlTextReader reader = new XmlTextReader(path); // warn
}
catch { throw ; }
finally {}
}
}
}
Soluzione 7
using System.Xml;
namespace TestNamespace
{
public class TestClass
{
public void TestMethod(string path)
{
XmlReaderSettings settings = new XmlReaderSettings() { XmlResolver = null };
XmlReader reader = XmlReader.Create(path, settings);
}
}
}
Nota
Sebbene XmlReader.Create sia il modo consigliato per creare un'istanza XmlReader di , esistono differenze di comportamento rispetto a XmlTextReader. Oggetto XmlReader da Create normalizzato \r\n
a \n
in valori XML, mantenendo XmlTextReader la \r\n
sequenza.