Indicazioni per la codifica sicuraSecure coding guidelines

La sicurezza basata sull'evidenza e la sicurezza per l'accesso al codice forniscono meccanismi espliciti molto efficaci per implementare la sicurezza.Evidence-based security and code access security provide very powerful, explicit mechanisms to implement security. Gran parte del codice dell'applicazione è possibile utilizzare semplicemente l'infrastruttura implementata da .NET.Most application code can simply use the infrastructure implemented by .NET. In alcuni casi è tuttavia necessaria una sicurezza aggiuntiva specifica per l'applicazione, creata mediante l'estensione del sistema di sicurezza o tramite metodi ad hoc.In some cases, additional application-specific security is required, built either by extending the security system or by using new ad hoc methods.

Usando .NET imposti le autorizzazioni e altri tipi di sicurezza nel codice, si consentono barriere che impediscono l'accesso alle informazioni che non si desidera che siano o eseguire altre operazioni di codice dannoso.Using .NET enforced permissions and other enforcement in your code, you should erect barriers to prevent malicious code from accessing information that you don't want it to have or performing other undesirable actions. È inoltre necessario raggiungere un compromesso tra sicurezza e usabilità del codice in tutti gli scenari d'uso di codice attendibile.Additionally, you must strike a balance between security and usability in all the expected scenarios using trusted code.

In questa panoramica vengono descritti i diversi metodi di progettazione del codice per l'uso del sistema di sicurezza.This overview describes the different ways code can be designed to work with the security system.

Proteggere l'accesso alle risorseSecuring resource access

Durante la progettazione e la scrittura del codice, è necessario proteggere e limitare l'accesso del codice alle risorse, soprattutto quando si usa o chiama codice di origine sconosciuta.When designing and writing your code, you need to protect and limit the access that code has to resources, especially when using or invoking code of unknown origin. Le tecniche seguenti consentono di verificare che il codice sia sicuro:So, keep in mind the following techniques to ensure your code is secure:

  • Non usare Sicurezza per l'accesso al codice (CAS, Code Access Security).Do not use Code Access Security (CAS).

  • Non usare codice parzialmente attendibile.Do not use partial trusted code.

  • Non usare la AllowPartiallyTrustedCaller attributo (APTCA).Do not use the AllowPartiallyTrustedCaller attribute (APTCA).

  • Non usare Servizi remoti .NET.Do not use .NET Remoting.

  • Non usare DCOM (Distributed Component Object Model).Do not use Distributed Component Object Model (DCOM).

  • Non utilizzare formattori binari.Do not use binary formatters.

Sicurezza dall'accesso di codice e codice SecurityTransparent non sono supportati come limite di sicurezza con codice parzialmente attendibile.Code Access Security and Security-Transparent Code are not supported as a security boundary with partially trusted code. 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. Le misure di protezione alternative sono:The alternative security measures are:

  • VirtualizzazioneVirtualization

  • AppContainersAppContainers

  • Utenti e autorizzazioni del sistema operativo (SO)Operating system (OS) users and permissions

  • Contenitori Hyper-VHyper-V containers

Codice indipendente dalla sicurezzaSecurity-neutral code

Il codice indipendente dalla sicurezza non ha elementi espliciti in comune con il sistema di sicurezzaSecurity-neutral code does nothing explicit with the security system. e viene eseguito a prescindere dalle autorizzazioni ricevuteIt runs with whatever permissions it receives. Sebbene le applicazioni che non riescono a intercettare eccezioni associate alle operazioni protette (ad esempio usando i file, rete e così via) possono generare un'eccezione non gestita, il codice indipendente dalla sicurezza ancora sfrutta le tecnologie di sicurezza in .NET .Although applications that fail to catch security exceptions associated with protected operations (such as using files, networking, and so on) can result in an unhandled exception, security-neutral code still takes advantage of the security technologies in .NET.

Una libreria indipendente dalla sicurezza dispone di caratteristiche speciali che è necessario comprendere.A security-neutral library has special characteristics that you should understand. Si supponga che nella libreria siano forniti elementi API che utilizzano i file o chiamare codice non gestito.Suppose your library provides API elements that use files or call unmanaged code. Se il codice non dispone dell'autorizzazione corrispondente, non verrà eseguito come descritto.If your code doesn't have the corresponding permission, it won't run as described. Tuttavia, anche al codice viene concessa l'autorizzazione, il codice delle applicazioni da cui tale codice viene chiamato deve disporre della stessa autorizzazione per funzionare.However, even if the code has the permission, any application code that calls it must have the same permission in order to work. Se il codice chiamante non dispone dell'autorizzazione appropriata, un SecurityException viene visualizzato a seguito di stack il codice di sicurezza l'accesso.If the calling code doesn't have the right permission, a SecurityException appears as a result of the code access security stack walk.

Codice dell'applicazione che non è un componente riutilizzabileApplication code that isn't a reusable component

Se il codice è parte di un'applicazione che non verrà richiamata da altro codice, la sicurezza è semplice e potrebbe non essere necessario scrivere codice speciale.If your code is part of an application that won't be called by other code, security is simple and special coding might not be required. Tenere comunque presente che il codice può essere chiamato da codice dannoso.However, remember that malicious code can call your code. Anche se la sicurezza per l'accesso al codice può impedire a codice dannoso di accedere alle risorse, con questo codice è comunque possibile leggere i valori contenuti nei campi o nelle proprietà che possono rappresentare informazioni sensibili.While code access security might stop malicious code from accessing resources, such code could still read values of your fields or properties that might contain sensitive information.

Se inoltre il codice accetta input da Internet o da altre fonti inaffidabili, è opportuno evitare input dannosi.Additionally, if your code accepts user input from the Internet or other unreliable sources, you must be careful about malicious input.

Wrapper gestiti nell'implementazione di codice nativoManaged wrapper to native code implementation

In genere, in uno scenario di questo tipo, viene implementata una funzionalità utile nel codice nativo da rendere disponibile per il codice gestito.Typically in this scenario, some useful functionality is implemented in native code that you want to make available to managed code. I wrapper gestiti possono essere scritti in modo semplice usando platform invoke o l'interoperabilità COM.Managed wrappers are easy to write using either platform invoke or COM interop. Per la riuscita di questa operazione è tuttavia necessario che i chiamanti dei wrapper dispongano di diritti per il codice non gestito.However, if you do this, callers of your wrappers must have unmanaged code rights in order to succeed. In base ai criteri predefiniti, ciò significa che il codice scaricato da una rete intranet o Internet non funzionerà con i wrapper.Under default policy, this means that code downloaded from an intranet or the Internet won't work with the wrappers.

Anziché concedere diritti di codice non gestito per tutte le applicazioni che utilizzano questi wrapper, è preferibile fornire questi diritti solo al codice wrapper.Instead of giving unmanaged code rights to all applications that use these wrappers, it's better to give these rights only to the wrapper code. Se la funzionalità sottostante non espone alcuna risorsa e l'implementazione è probabilmente sicura, per il wrapper è sufficiente l'asserzione dei diritti, che consente la chiamata tramite codice.If the underlying functionality exposes no resources and the implementation is likewise safe, the wrapper only needs to assert its rights, which enables any code to call through it. Quando sono coinvolte le risorse, il codice della sicurezza deve essere analogo a quello di libreria descritto nella sezione successiva.When resources are involved, security coding should be the same as the library code case described in the next section. Poiché il wrapper può esporre i chiamanti a queste risorse, la verifica attenta della sicurezza del codice nativo è necessaria e costituisce uno dei compiti del wrapper.Because the wrapper is potentially exposing callers to these resources, careful verification of the safety of the native code is necessary and is the wrapper's responsibility.

Codice di libreria che espone risorse protetteLibrary code that exposes protected resources

L'approccio seguente è più efficace e potenzialmente pericoloso, se eseguito in modo non corretto, codifica della sicurezza: la libreria funge da interfaccia per altro codice accedere ad alcune risorse non altrimenti disponibili, così come le classi .NET impongono autorizzazioni per le risorse che usano.The following approach is the most powerful and hence potentially dangerous (if done incorrectly) for security coding: your library serves as an interface for other code to access certain resources that aren't otherwise available, just as the .NET classes enforce permissions for the resources they use. Se si espone una risorsa, è necessario per prima cosa esigere tramite codice l'autorizzazione adeguata alla risorsa (in altre parole, eseguire un controllo di sicurezza) e quindi eseguire un'asserzione dei relativi diritti per eseguire l'operazione vera e propria.Wherever you expose a resource, your code must first demand the permission appropriate to the resource (that is, it must perform a security check) and then typically assert its rights to perform the actual operation.

TitoloTitle DescrizioneDescription
Protezione dei dati di statoSecuring State Data Viene descritto come proteggere membri privati.Describes how to protect private members.
Sicurezza e input dell'utenteSecurity and User Input Vengono descritti argomenti relativi alla sicurezza delle applicazioni che accettano input dell'utente.Describes security concerns for applications that accept user input.
Sicurezza e race conditionSecurity and Race Conditions Viene descritto come evitare race condition nel codice.Describes how to avoid race conditions in your code.
Sicurezza e generazione di codice immediataSecurity and On-the-Fly Code Generation Vengono descritti aspetti della sicurezza relativi alle applicazioni che consentono di generare codice dinamico.Describes security concerns for applications that generate dynamic code.
Sicurezza basata sui ruoliRole-Based Security Viene descritta la sicurezza basata sui ruoli .NET in modo dettagliato e vengono fornite istruzioni per l'utilizzo nel codice.Describes .NET role-based security in detail and provides instructions for using it in your code.