Condividi tramite


Demand e LinkDemand

Aggiornamento: novembre 2007

La protezione dichiarativa offre due tipi di controllo di protezione simili ma che eseguono controlli molto diversi. È necessario comprendere entrambe le forme, in quanto una scelta errata può provocare problemi di protezione o riduzione delle prestazioni. Per ulteriori informazioni, vedere Pretese di protezione.

La protezione dichiarativa fornisce i due controlli di protezione seguenti:

  • Demand specifica l'analisi dello stack ai fini della protezione dall'accesso di codice. Per essere accettati tutti i chiamanti dello stack devono disporre dell'autorizzazione o dell'identità specificata. Demand viene eseguito su tutte le chiamate in quanto lo stack può contenere chiamanti diversi. Se si chiama ripetutamente un metodo, il controllo di protezione si verifica ogni volta. Demand costituisce un metodo di protezione valido contro gli attacchi subdoli; il codice non autorizzato che tenti di aggirare questo controllo verrà rilevato.

  • LinkDemand si verifica solo nella compilazione JIT (Just-In-Time) e verifica solo il chiamante immediato. Questo controllo di protezione non verifica il chiamante del chiamante. Una volta passato il controllo, non si verifica alcun overhead aggiuntivo della protezione a prescindere da quante volte viene effettuata la chiamata, ma non è presente alcuna protezione contro gli attacchi subdoli. Con LinkDemand, il codice che passa la verifica e che può fare riferimento al codice può provocare problemi di protezione consentendo a codice dannoso di eseguire chiamate tramite il codice non autorizzato. È opportuno quindi non utilizzare LinkDemand a meno che non sia possibile evitare completamente tutti i problemi possibili.

Le precauzioni aggiuntive necessarie per l'utilizzo di LinkDemand devono essere programmate singolarmente; il sistema di protezione può consentire l'applicazione di criteri più rigidi. Ogni errore provoca l'indebolimento della protezione. Tutto il codice autorizzato che sfrutta il codice dell'applicazione deve potere implementare la protezione aggiuntiva tramite le seguenti operazioni:

  • Limitare l'accesso del codice chiamante alla classe o all'assembly.

  • Eseguire gli stessi controlli di protezione sia sul codice chiamante che su quello chiamato e fare in modo che la stessa operazione sia eseguita dai relativi chiamanti. Se, ad esempio, si scrive codice in cui viene chiamato un metodo protetto tramite LinkDemand per un oggetto SecurityPermission in cui sia specificato il flag UnmanagedCode, il metodo deve anche eseguire una richiesta LinkDemand o Demand (più sicura) per l'autorizzazione. L'eccezione è rappresentata dalla possibilità che nel codice venga utilizzato in maniera limitata un metodo protetto da LinkDemand che è possibile impostare come sicuro, a patto che nel codice siano presenti altri meccanismi di protezione come le pretese. In questo caso eccezionale, il chiamante provoca l'indebolimento della protezione del code-behind.

  • Fare in modo che i chiamanti del codice non possano determinare una chiamata per loro conto al codice protetto. In altre parole, i chiamanti non possono determinare il passaggio di parametri specifici da parte del codice al codice protetto o ottenere risultati da questo.

Interfacce e pretese di collegamento

Se un metodo virtuale, una proprietà o un evento con LinkDemand esegue l'override di un metodo di una classe base, perché metodo sottoposto a override sia efficace è necessario che anche il metodo della classe base disponga della stessa pretesa LinkDemand. Il codice dannoso può eseguire nuovamente il cast nel tipo di base e chiamare il metodo della classe base. Si noti inoltre che è possibile aggiungere in modo implicito richieste di collegamento ad assembly che non dispongono dell'attributo a livello di assembly AllowPartiallyTrustedCallersAttribute.

È consigliabile proteggere le implementazioni dei metodi con pretese di collegamento quando anche i metodi di interfaccia dispongono di pretese di collegamento. L'utilizzo di pretese di collegamento con interfacce determina quanto segue:

  • L'attributo AllowPartiallyTrustedCallersAttribute si applica anche alle interfacce.

  • È possibile inserire pretese di collegamento nelle interfacce per proteggere selettivamente alcune interfacce dall'utilizzo da parte di codice parzialmente attendibile, come nel caso dell'utilizzo dell'attributo AllowPartiallyTrustedCallersAttribute.

  • Se l'interfaccia è definita in un assembly che non contiene l'attributo AllowPartiallyTrustedCallersAttribute, è possibile implementare tale interfaccia su una classe parzialmente attendibile.

  • Se si inserisce una pretesa LinkDemand su un metodo pubblico di una classe che implementa un metodo di interfaccia, la pretesa LinkDemand non viene applicata se si esegue il cast nell'interfaccia e si chiama il metodo. In questo caso, poiché viene eseguito il collegamento all'interfaccia, viene accettata solo la pretesa LinkDemand per l'interfaccia.

Rivedere gli elementi riportati di seguito nel caso di problemi di protezione.

  • Pretese di collegamento esplicite su metodi di interfaccia. Accertarsi che le pretese di collegamento forniscano la protezione prevista. Determinare se il codice dannoso consente di sfruttare un cast per aggirare le richieste di collegamento come descritto in precedenza.

  • Metodi virtuali con pretese di collegamento applicate.

  • I tipi e le interfacce implementate da questi. Le pretese di collegamento devono essere utilizzate in modo coerente in tali tipi e interfacce.

Vedere anche

Altre risorse

Indicazioni per la generazione di codice protetto