Поделиться через


XmlSecureResolver устарел

Метод System.Xml.XmlSecureResolver.GetEntity(Uri, String, Type) безусловно создает исключение XmlException во время выполнения. Если приложение использует XmlSecureResolver и пытается разрешить xml-ресурс через него, разрешение завершится сбоем с исключением.

Кроме того, весь System.Xml.XmlSecureResolver тип устарел. Все ссылки на этот тип приводят к предупреждению SYSLIB0047 во время сборки. Если вы включили предупреждения в качестве ошибок, это приведет к разрыву сборки, если приложение ссылается 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);

Прежнее поведение

В платформа .NET Framework XmlSecureResolver.GetEntity(Uri, String, Type) создает песочницу безопасности доступа к коду (CAS), чтобы ограничить процесс разрешения внешних ресурсов XML. Если политика нарушается, SecurityException создается исключение.

В .NET Core 3.1 и .NET 6 XmlSecureResolver.GetEntity(Uri, String, Type) не ограничивает разрешение внешних ресурсов XML вообще. Разрешение внешних ресурсов допускается без ограничений.

Новое поведение

Начиная с .NET 7, XmlSecureResolver.GetEntity(Uri, String, Type) безусловно создает XmlExceptionисключение. Он не создает песочницу CAS и не пытается устранить внешний ресурс.

Представленные версии

.NET 7

Тип критического изменения

Это изменение может повлиять на совместимость исходного кода и совместимость на уровне двоичного кода.

Причина изменения

Это изменение повышает безопасность экосистемы .NET. Эта обзолеция перемещает поведение XmlSecureResolver от отработки отказа (всегда выполнять разрешение) в безопасное (никогда не выполняющее разрешение) при запуске в .NET 7 или более поздней версии.

Вместо этого рекомендуется использовать только что введенное статическое свойство XmlResolver.ThrowingResolver. Это свойство предоставляет XmlResolver экземпляр, который запрещает разрешение внешних ресурсов.

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;

Затронутые API