Sdílet prostřednictvím


Většina rozhraní API zabezpečení přístupu kódu je zastaralá.

Většina typů souvisejících se zabezpečením přístupu kódu (CAS) v .NET je nyní zastaralá jako upozornění. To zahrnuje atributy CAS, například SecurityPermissionAttributeobjekty oprávnění CAS, jako SocketPermissionjsou , EvidenceBase-odvozené typy a další podpůrné rozhraní API.

Změna popisu

V rozhraní .NET Framework 2.x – 4.x můžou atributy a rozhraní API cas ovlivnit průběh provádění kódu, včetně zajištění úspěšného nebo neúspěšného spuštění zásobníku požadavků CAS.

// In .NET Framework, the attribute causes CAS stack walks
// to terminate successfully when this permission is demanded.
[SocketPermission(SecurityAction.Assert, Host = "contoso.com", Port = "443")]
public void DoSomething()
{
    // open a socket to contoso.com:443
}

V .NET Core 2.x – 3.x modul runtime nedodržuje atributy CAS ani rozhraní API CAS. Modul runtime ignoruje atributy při zadávání metody a většina programových rozhraní API nemá žádný vliv.

// The .NET Core runtime ignores the following attribute.
[SocketPermission(SecurityAction.Assert, Host = "contoso.com", Port = "443")]
public void DoSomething()
{
    // open a socket to contoso.com:443
}

Kromě toho programová volání expansivních rozhraní API (Assert) vždy proběhne úspěšně, zatímco programová volání omezujících rozhraní API (Deny, PermitOnly) vždy vyvolá výjimku za běhu. (PrincipalPermission je výjimkou tohoto pravidla. Viz část Doporučená akce níže.)

public void DoAssert()
{
    // The line below has no effect at run time.
    new SocketPermission(PermissionState.Unrestricted).Assert();
}

public void DoDeny()
{
    // The line below throws PlatformNotSupportedException at run time.
    new SocketPermission(PermissionState.Unrestricted).Deny();
}

V .NET 5 a novějších verzích je většina rozhraní API souvisejících s CAS zastaralá a vytváří upozornění SYSLIB0003na dobu kompilace .

[SocketPermission(SecurityAction.Assert, Host = "contoso.com", Port = "443")] // warning SYSLIB0003
public void DoSomething()
{
    new SocketPermission(PermissionState.Unrestricted).Assert(); // warning SYSLIB0003
    new SocketPermission(PermissionState.Unrestricted).Deny(); // warning SYSLIB0003
}

Jedná se pouze o změnu v době kompilace. V předchozích verzích .NET Core nedošlo k žádné změně za běhu. Metody, které v .NET Core 2.x – 3.x neprovádějí žádnou operaci za běhu v .NET 5 a novějším. Metody, které vyvolají PlatformNotSupportedException .NET Core 2.x – 3.x, budou nadále hodit PlatformNotSupportedException za běhu v .NET 5 a novější.

Důvod změny

Zabezpečení přístupu kódu (CAS) je nepodporovaná starší technologie. Infrastruktura pro povolení CAS existuje pouze v rozhraní .NET Framework 2.x – 4.x, ale je zastaralá a nepřijímá servisní opravy nebo opravy zabezpečení.

Kvůli vyřazení casu se podpůrná infrastruktura nepřenesla do .NET Core nebo .NET 5 nebo novější. Rozhraní API však byla předána tak, aby aplikace mohly křížově kompilovat rozhraní .NET Framework a .NET Core. To vedlo ke scénářům selhání při otevření, kdy existují některá rozhraní API související s cas a jsou volatelná, ale v době běhu neprovádějí žádnou akci. To může vést k problémům se zabezpečením komponent, které očekávají, že modul runtime bude respektovat atributy související s CAS nebo programová volání rozhraní API. Abychom mohli lépe sdělit, že modul runtime tyto atributy nebo rozhraní API nerespektuje, zastaralá jsme většinu z nich v .NET 5.0.

Zavedená verze

5,0

  • Pokud používáte nějaké oprávnění zabezpečení, odeberte atribut nebo volání, které toto oprávnění potvrzuje.

    // REMOVE the attribute below.
    [SecurityPermission(SecurityAction.Assert, ControlThread = true)]
    public void DoSomething()
    {
    }
    
    public void DoAssert()
    {
        // REMOVE the line below.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Assert();
    }
    
  • Pokud jakékoli oprávnění odepřete nebo omezíte (prostřednictvím PermitOnly), obraťte se na svého poradce pro zabezpečení. Vzhledem k tomu, že modul runtime .NET 5+ nedotkuje atributy CAS, může mít vaše aplikace díru zabezpečení, pokud nesprávně spoléhá na infrastrukturu CAS k omezení přístupu k těmto metodám.

    // REVIEW the attribute below; could indicate security vulnerability.
    [SecurityPermission(SecurityAction.Deny, ControlThread = true)]
    public void DoSomething()
    {
    }
    
    public void DoPermitOnly()
    {
        // REVIEW the line below; could indicate security vulnerability.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).PermitOnly();
    }
    
  • Pokud požadujete jakékoli oprávnění (s výjimkou PrincipalPermission), odeberte poptávku. Všechny požadavky budou v době běhu úspěšné.

    // REMOVE the attribute below; it will always succeed.
    [SecurityPermission(SecurityAction.Demand, ControlThread = true)]
    public void DoSomething()
    {
    }
    
    public void DoDemand()
    {
        // REMOVE the line below; it will always succeed.
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Demand();
    }
    
  • Pokud požadujete PrincipalPermission, projděte si pokyny pro PrincipalPermissionAttribute, které jsou zastaralé jako chyba. Toto pokyny platí pro obě PrincipalPermission a PrincipalPermissionAttribute.

  • Pokud je nutné tato upozornění zcela zakázat (což se nedoporučuje), můžete upozornění v kódu potlačit SYSLIB0003 .

    #pragma warning disable SYSLIB0003 // disable the warning
    [SecurityPermission(SecurityAction.Demand, ControlThread = true)]
    #pragma warning restore SYSLIB0003 // re-enable the warning
    public void DoSomething()
    {
    }
    
    public void DoDemand()
    {
    #pragma warning disable SYSLIB0003 // disable the warning
        new SecurityPermission(SecurityPermissionFlag.ControlThread).Demand();
    #pragma warning restore SYSLIB0003 // re-enable the warning
    }
    

    Upozornění v souboru projektu můžete také potlačit. Tím se zakáže upozornění pro všechny zdrojové soubory v projektu.

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFramework>net5.0</TargetFramework>
        <!-- NoWarn below suppresses SYSLIB0003 project-wide -->
        <NoWarn>$(NoWarn);SYSLIB0003</NoWarn>
      </PropertyGroup>
    </Project>
    

    Poznámka:

    SYSLIB0003 Potlačení zakáže pouze upozornění na obsoletion související s CAS. Nezakážuje žádná další upozornění ani nemění chování modulu runtime .NET 5+ .

  • Zabezpečení

Ovlivněná rozhraní API