Protezione dell'accesso ai metodiSecuring Method Access

Attenzione

Sicurezza dall'accesso di codice e codice parzialmente attendibileCode Access Security and Partially Trusted Code

.NET Framework fornisce un meccanismo denominato sicurezza dall'accesso di codice, che consente di applicare vari livelli di attendibilità a codice diverso in esecuzione nella stessa applicazione.The .NET Framework provides a mechanism for the enforcement of varying levels of trust on different code running in the same application called Code Access Security (CAS). La sicurezza per l'accesso di codice in .NET Framework non deve essere usata come meccanismo per l'applicazione dei limiti di sicurezza in base alla creazione di codice o altri aspetti di identità.Code Access Security in .NET Framework should not be used as a mechanism for enforcing security boundaries based on code origination or other identity aspects. Le linee guida sono state modificate per specificare che la sicurezza per l'accesso di codice e il codice SecurityTransparent non saranno supportati come limiti di sicurezza con codice parzialmente attendibile, soprattutto nel caso di codice di origine sconosciuta.We are updating our guidance to reflect that Code Access Security and Security-Transparent Code will not be supported as a security boundary with partially trusted code, especially code of unknown origin. Non è consigliabile caricare ed eseguire codice di origine sconosciuta in assenza di misure di sicurezza alternative.We advise against loading and executing code of unknown origins without putting alternative security measures in place.

Questi criteri si applicano a tutte le versioni di .NET Framework, ma non alla versione di .NET Framework inclusa in Silverlight.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

Alcuni metodi potrebbero non essere adatti per consentire le chiamate da parte di codice non attendibile arbitrario.Some methods might not be suitable to allow arbitrary untrusted code to call. Tali metodi comportano diversi rischi: il metodo può fornire informazioni riservate; può ritenere valide tutte le informazioni passate; può non controllare gli errori sui parametri; con i parametri non corretti, potrebbe presentare problemi di funzionamento o causare danni.Such methods pose several risks: The method might provide some restricted information; it might believe any information passed to it; it might not do error checking on the parameters; or with the wrong parameters, it might malfunction or do something harmful. L'utente dovrebbe essere informato di questi casi e adottare le misure appropriate per proteggere il metodo.You should be aware of these cases and take action to help protect the method.

In alcuni casi, potrebbe essere necessario limitare i metodi che non sono destinati all'uso pubblico, ma che devono comunque essere pubblici;In some cases, you might need to restrict methods that are not intended for public use but still must be public. ad esempio, nel caso di un'interfaccia che deve essere chiamata attraverso le proprie DLL e pertanto deve essere pubblica, ma che non si vuole esporre pubblicamente per evitare che i clienti la usino oppure per impedire che il codice dannoso sfrutti il punto di ingresso al componente.For example, you might have an interface that needs to be called across your own DLLs and hence must be public, but you do not want to expose it publicly to prevent customers from using it or to prevent malicious code from exploiting the entry point into your component. Un altro motivo comune per limitare un metodo non destinato all'uso pubblico (ma che deve essere pubblico) consiste nell'evitare di dover documentare e supportare quella che potrebbe essere un'interfaccia molto interna.Another common reason to restrict a method not intended for public use (but that must be public) is to avoid having to document and support what might be a very internal interface.

Il codice gestito offre diversi modi per limitare l'accesso ai metodi:Managed code offers several ways to restrict method access:

  • Limitare l'ambito di accessibilità alla classe, all'assembly o alle classi derivate, se possono essere attendibili.Limit the scope of accessibility to the class, assembly, or derived classes, if they can be trusted. Questo è il modo più semplice per limitare l'accesso del metodo.This is the simplest way to limit method access. Si noti che, in generale, le classi derivate possono essere meno affidabili rispetto alla classe da cui derivano, anche se in alcuni casi condividono l'identità della classe padre.Note that, in general, derived classes can be less trustworthy than the class they derive from, though in some cases they share the parent class's identity. In particolare, non attribuire attendibilità alla parola chiave protetti, che non è necessariamente usata nel contesto di sicurezza.In particular, do not infer trust from the keyword protected, which is not necessarily used in the security context.

  • Limitare l'accesso al metodo ai chiamanti di un'identità specificata, in pratica, qualsiasi particolare evidenza (nome sicuro, publisher, zona e così via) desiderato.Limit the method access to callers of a specified identity--essentially, any particular evidence (strong name, publisher, zone, and so on) you choose.

  • Limitare l'accesso al metodo ai chiamanti che dispongono delle autorizzazioni selezionate.Limit the method access to callers having whatever permissions you select.

Analogamente, la sicurezza dichiarativa consente di controllare l'ereditarietà delle classi.Similarly, declarative security allows you to control inheritance of classes. È possibile utilizzare InheritanceDemand per eseguire le operazioni seguenti:You can use InheritanceDemand to do the following:

  • Richiedere le classi derivate per ottenere un'identità o autorizzazione specificata.Require derived classes to have a specified identity or permission.

  • Richiedere le classi derivate che eseguono l'override di metodi specifici per ottenere un'identità o autorizzazione specificata.Require derived classes that override specific methods to have a specified identity or permission.

L'esempio seguente illustra come proteggere una classe pubblica per l'accesso limitato richiedendo che i chiamanti siano firmati con un nome sicuro specifico.The following example shows how to help protect a public class for limited access by requiring that callers be signed with a particular strong name. Questo esempio viene utilizzato il StrongNameIdentityPermissionAttribute con un richiesta per il nome sicuro.This example uses the StrongNameIdentityPermissionAttribute with a Demand for the strong name. Per informazioni su come firmare un assembly con un nome sicuro, vedere creazione e uso degli assembly.For task-based information on how to sign an assembly with a strong name, see Creating and Using Strong-Named Assemblies.

<StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey := "…hex…", Name := "App1", Version := "0.0.0.0")>  _  
Public Class Class1  
End Class  
[StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey="…hex…", Name="App1", Version="0.0.0.0")]  
public class Class1  
{  

}   

Esclusione di classi e membri dall'uso da parte di codice non attendibileExcluding Classes and Members from Use by Untrusted Code

Usare le dichiarazioni illustrate in questa sezione per impedire l'uso di specifiche classi e metodi, nonché proprietà ed eventi, da parte di codice parzialmente attendibile.Use the declarations shown in this section to prevent specific classes and methods, as well as properties and events, from being used by partially trusted code. Applicando tali dichiarazioni a una classe, è possibile applicare la protezione a tutti i relativi metodi, proprietà ed eventi. Si noti tuttavia che l'accesso al campo non è influenzato dalla protezione dichiarativa.By applying these declarations to a class, you apply the protection to all its methods, properties, and events; however, note that field access is not affected by declarative security. Si noti inoltre che le richieste di collegamento aiutano a proteggere solo dai chiamanti immediati e potrebbero essere comunque soggette ad attacchi.Note also that link demands help protect against only the immediate callers and might still be subject to luring attacks.

Nota

È stato introdotto un nuovo modello di trasparenza in .NET Framework 4.NET Framework 4.A new transparency model has been introduced in the .NET Framework 4.NET Framework 4. Il codice SecurityTransparent, livello 2 modello consente di identificare il codice sicuro con il SecurityCriticalAttribute attributo.The Security-Transparent Code, Level 2 model identifies secure code with the SecurityCriticalAttribute attribute. Il codice critico per la sicurezza richiede che chiamanti ed eredi siano completamente attendibili.Security-critical code requires both callers and inheritors to be fully trusted. Gli assembly in esecuzione con le regole di protezione dell'accesso al codice delle versioni precedenti di .NET Framework possono chiamare gli assembly di livello 2.Assemblies that are running under the code access security rules from earlier .NET Framework versions can call level 2 assemblies. In questo caso, gli attributi critici per la sicurezza verranno considerati come richieste di collegamento per l'attendibilità totale.In this case, the security-critical attributes will be treated as link demands for full trust.

Negli assembly con nome sicuro, un LinkDemand viene applicato a tutti i metodi accessibili pubblicamente, proprietà ed eventi per limitare l'uso ai soli chiamanti completamente attendibili.In strong-named assemblies, a LinkDemand is applied to all publicly accessible methods, properties, and events therein to restrict their use to fully trusted callers. Per disabilitare questa funzionalità, è necessario applicare l'attributo AllowPartiallyTrustedCallersAttribute.To disable this feature, you must apply the AllowPartiallyTrustedCallersAttribute attribute. Di conseguenza, contrassegnare esplicitamente le classi in modo da escludere i chiamanti non attendibili è necessario solo per gli assembly non firmati oppure per gli assembly con questo attributo. È possibile usare queste dichiarazioni per contrassegnare un sottoinsieme di tipi non destinati a chiamanti non attendibili.Thus, explicitly marking classes to exclude untrusted callers is necessary only for unsigned assemblies or assemblies with this attribute; you can use these declarations to mark a subset of types therein that are not intended for untrusted callers.

Gli esempi seguenti illustrano come impedire l'uso di classi e membri da parte di codice non attendibile.The following examples show how to prevent classes and members from being used by untrusted code.

Per le classi non sealed pubbliche:For public nonsealed classes:

<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.InheritanceDemand, Name := "FullTrust"), _   
System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name := "FullTrust")>  _  
Public Class CanDeriveFromMe  
End Class  
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.InheritanceDemand, Name="FullTrust")]  
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name="FullTrust")]  
public class CanDeriveFromMe  
{  
}  

Per le classi sealed pubbliche:For public sealed classes:

<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name := "FullTrust")>  _  
NotInheritable Public Class CannotDeriveFromMe  
End Class  
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name="FullTrust")]  
public sealed class CannotDeriveFromMe  
{  
}  

Per le classi astratte pubbliche:For public abstract classes:

<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.InheritanceDemand, Name := "FullTrust"), _  
System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name := "FullTrust")>  _  
MustInherit Public Class CannotCreateInstanceOfMe_CanCastToMe  
End Class  
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.InheritanceDemand, Name="FullTrust")]  
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name="FullTrust")]  
public abstract class CannotCreateInstanceOfMe_CanCastToMe{}  

Per le funzioni virtuali pubbliche:For public virtual functions:

Class Base1   
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.InheritanceDemand, Name:="FullTrust"), System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name:="FullTrust")> _  
    Public Overridable Sub CanOverrideOrCallMe()  
    End Sub 'CanOverrideOrCallMe  
End Class 'Base1  
class Base1   
{  
[System.Security.Permissions.PermissionSetAttribute(  
System.Security.Permissions.SecurityAction.InheritanceDemand, Name="FullTrust")]  
[System.Security.Permissions.PermissionSetAttribute(  
System.Security.Permissions.SecurityAction.LinkDemand, Name="FullTrust")]  
    public virtual void CanOverrideOrCallMe() {}  
}  

Per le funzioni astratte pubbliche:For public abstract functions:

MustInherit Class Base2  
    <System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.InheritanceDemand, Name:="FullTrust"), System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name:="FullTrust")> _  
    Public Sub MustOverrideMe()  
    End Sub  
End Class 'Base2  
abstract class Base2{  
[System.Security.Permissions.PermissionSetAttribute(  
System.Security.Permissions.SecurityAction.InheritanceDemand, Name = "FullTrust")]  
[System.Security.Permissions.PermissionSetAttribute(  
System.Security.Permissions.SecurityAction.LinkDemand, Name = "FullTrust")]  
public abstract void MustOverrideMe();  
}  

Per le funzioni pubbliche di override in cui la classe di base non richiede l'attendibilità totale:For public override functions where the base class does not demand full trust:

Class Derived  
    Inherits Base1  
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _  
    Public Overrides Sub CanOverrideOrCallMe()  
        MyBase.CanOverrideOrCallMe()  
    End Sub 'CanOverrideOrCallMe  
End Class 'Derived  
class Derived : Base1  
{     
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]      
    public override void CanOverrideOrCallMe()   
    {  
        base.CanOverrideOrCallMe();  
    }  
}  

Per le funzioni pubbliche di override in cui la classe di base richiede l'attendibilità totale:For public override functions where the base class demands full trust:

Class Derived  
    Inherits Base1  
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name:="FullTrust")> _  
    Public Overrides Sub CanOverrideOrCallMe()  
        MyBase.CanOverrideOrCallMe()  
    End Sub 'CanOverrideOrCallMe   
End Class 'Derived  
class Derived : Base1  
{     
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name="FullTrust")]      
    public override void CanOverrideOrCallMe()   
    {  
        base.CanOverrideOrCallMe();  
    }  
}  

Per le interfacce pubbliche:For public interfaces:

Public Interface ICanCastToMe  
    <System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name:="FullTrust"), System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.InheritanceDemand, Name:="FullTrust")> _  
    Sub CanImplementMe()  
End Interface 'ICanCastToMe  
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name:="FullTrust"), System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.InheritanceDemand, Name:="FullTrust")> _  
Class Implemented  
    Implements ICanCastToMe  
    Public Sub CanImplementMe()  
    End Sub 'CanImplementMe  
public interface ICanCastToMe   
{  
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name = "FullTrust")]  
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.InheritanceDemand, Name = "FullTrust")]  
void CanImplementMe();  
}  
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name = "FullTrust")]  
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.InheritanceDemand, Name = "FullTrust")]  
class Implemented : ICanCastToMe  
{  
    public void CanImplementMe()  
    {  
    }  
}  

Override virtual interni e friend sottoponibile a override da overloadVirtual Internal Overrides or Overloads Overridable Friend

Nota

In questa sezione illustra un problema di sicurezza quando si dichiara un metodo come virtual e internal (Overloads``Overridable``Friend in Visual Basic).This section warns about a security issue when declaring a method as both virtual and internal (Overloads``Overridable``Friend in Visual Basic). Questo avviso si applica solo alle versioni 1.0 e 1.1 di .NET Framework, ma non si applica alle versioni successive.This warning applies only to the .NET Framework versions 1.0 and 1.1, it does not apply to later versions.

Nelle versioni di .NET Framework 1.0 e 1.1, è necessario considerare una sfumatura di accessibilità al sistema di tipi quando si conferma che il codice non è disponibile ad altri assembly.In the .NET Framework versions 1.0 and 1.1, you must be aware of a nuance of the type system accessibility when confirming that your code is unavailable to other assemblies. Un metodo dichiarato virtuale e interno (Overloads Overridable Friend in Visual Basic) può eseguire l'override di voce vtable della classe padre e può essere utilizzato solo da all'interno dello stesso assembly in quanto è interno.A method that is declared virtual and internal (Overloads Overridable Friend in Visual Basic) can override the parent class's vtable entry and can be used only from within the same assembly because it is internal. Tuttavia, l'accessibilità per eseguire l'override è determinata dal virtuale (parola chiave) che può essere sottoposto a override da un altro assembly, purché tale codice possa accedere alla stessa classe.However, the accessibility for overriding is determined by the virtual keyword, and this can be overridden from another assembly as long as that code has access to the class itself. Se la possibilità di un override presenta un problema, utilizzare la sicurezza dichiarativa per risolverlo o rimuovere il virtuale parola chiave se non è strettamente necessaria.If the possibility of an override presents a problem, use declarative security to fix it, or remove the virtual keyword if it is not strictly required.

Si noti che anche se un compilatore di linguaggio impedisce questi override con un errore di compilazione, è possibile eseguire l'override per il codice scritto con altri compilatori.Note that even if a language compiler prevents these overrides with a compilation error, it is possible for code written with other compilers to override.

Vedere ancheSee Also

Linee guida per la generazione di codice sicuroSecure Coding Guidelines