Compartilhar via


XmlSecureResolver está obsoleto

O método System.Xml.XmlSecureResolver.GetEntity(Uri, String, Type) lança incondicionalmente uma XmlException em tempo de execução. Se o aplicativo utilizar XmlSecureResolver e você tentar resolver um recurso XML por meio dele, a resolução falhará com uma exceção.

Além disso, todo o tipo System.Xml.XmlSecureResolver está obsoleto. Todas as referências a esse tipo resultarão em um aviso SYSLIB0047 no momento do build. Se você tiver habilitado avisos como erros, isso causará uma quebra de build se o aplicativo fizer referência 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 run time.
object entity = resolver.GetEntity(
    absoluteUri: new Uri("https://www.example.com/some-entity"),
    role: null,
    ofObjectToReturn: null);

Comportamento anterior

No .NET Framework, XmlSecureResolver.GetEntity(Uri, String, Type) constrói uma área restrita CAS (segurança de acesso do código) para restringir o processo de resolução de recursos XML externos. Se a política for violada, uma SecurityException será lançada.

No .NET Core 3.1 e no .NET 6, XmlSecureResolver.GetEntity(Uri, String, Type) não restringe a resolução de recursos XML externos. A resolução de recursos externos tem permissão para continuar sem limitações.

Novo comportamento

A partir do .NET 7, o XmlSecureResolver.GetEntity(Uri, String, Type) lança incondicionalmente uma XmlException. Ele não constrói uma área restrita CAS e não tenta resolver o recurso externo.

Versão introduzida

.NET 7

Tipo de alteração interruptiva

Essa alteração pode afetar a compatibilidade com binários e a compatibilidade com a origem.

Motivo da alteração

Essa alteração melhora a segurança do ecossistema do .NET. Essa obsolescência move o comportamento de XmlSecureResolver de fail-dangerous (sempre executar resolução) para fail-safe (nunca executar resolução) ao executar no .NET 7 ou versões posteriores.

Em vez disso, considere usar a propriedade estática recém-introduzida XmlResolver.ThrowingResolver. Essa propriedade fornece uma instância XmlResolver que proíbe a resolução de recursos externos.

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;

APIs afetadas