Condividi tramite


XmlSecureResolver è obsoleto

Il metodo System.Xml.XmlSecureResolver.GetEntity(Uri, String, Type) genera in modo incondizionato un oggetto XmlException in fase di esecuzione. Se l'applicazione usa XmlSecureResolver e si tenta di risolvere una risorsa XML tramite essa, la risoluzione avrà esito negativo con un'eccezione.

Inoltre, l'intero System.Xml.XmlSecureResolver tipo è obsoleto. Tutti i riferimenti a questo tipo genereranno un avviso SYSLIB0047 in fase di compilazione. Se hai abilitato gli avvisi come errori, questo causerà un'interruzione della compilazione se l'applicazione fa riferimento a XmlSecureResolver.

using System.Xml;

// Compiler warning SYSLIB0047: XmlSecureResolver type is obsolete.
XmlResolver resolver = new XmlSecureResolver(
    resolver: new XmlUrlResolver(),
    securityUrl: "https://www.example.com/");

// Call to XmlSecureResolver.GetEntity below throws XmlException at runtime.
object entity = resolver.GetEntity(
    absoluteUri: new Uri("https://www.example.com/some-entity"),
    role: null,
    ofObjectToReturn: null);

Comportamento precedente

In .NET Framework, XmlSecureResolver.GetEntity(Uri, String, Type) costruisce una sandbox CAS (Code Access Security) per limitare il processo di risoluzione delle risorse XML esterne. Se i criteri vengono violati, viene generata un'eccezione SecurityException .

In .NET Core 3.1 e .NET 6 XmlSecureResolver.GetEntity(Uri, String, Type) non limita affatto la risoluzione delle risorse XML esterne. La risoluzione delle risorse esterne può procedere senza limitazioni.

Nuovo comportamento

A partire da .NET 7, XmlSecureResolver.GetEntity(Uri, String, Type) genera in modo incondizionato un'eccezione XmlException. Non costruisce una sandbox CAS e non tenta di risolvere la risorsa esterna.

Versione introdotta

.NET 7

Tipo di cambiamento che interrompe la compatibilità

Questa modifica può influire sulla compatibilità dell'origine e sulla compatibilità binaria.

Motivo della modifica

Questa modifica migliora la sicurezza dell'ecosistema .NET. Questa obsolescenza sposta il comportamento di XmlSecureResolver da pericoloso in caso di errore (esegue sempre la risoluzione) a sicuro in caso di errore (non esegue mai la risoluzione) quando viene eseguito su .NET 7 o versioni successive.

Prendere invece in considerazione l'uso della proprietà XmlResolver.ThrowingResolverstatica appena introdotta. Questa proprietà fornisce un'istanza XmlResolver che impedisce la risoluzione delle risorse esterne.

using System.Xml;

// BAD: Do not use XmlSecureResolver.
// XmlResolver resolver = new XmlSecureResolver(
//     resolver: new XmlUrlResolver(),
//     securityUrl: "https://www.example.com/");

// GOOD: Use XmlResolver.ThrowingResolver instead.
XmlResolver resolver = XmlResolver.ThrowingResolver;

Le API interessate