2012-01-01 15 views
6

Okay, ho un'applicazione che voglio aggiungere supporto per altre persone per scrivere i moduli che l'applicazione caricherà.C# Load Sandboxed Assembly

I moduli sarebbero una classe che estende la mia classe Module, scritta in .Net. Ho bisogno di sapere come caricare queste DLL in un ambiente sandbox, consentendo solo loro di leggere/scrivere in determinate directory.

È possibile?

+1

domande simili: [Caricamento assiemi da un'applicazione .NET in un 'ambiente Sandbox'] (http://stackoverflow.com/questions/510071/loading-assemblies-from-a-net -application-in-a-sandbox-environment), [In .NET 4.0, come faccio a 'sandbox' un assembly in memoria ed eseguo un metodo?] (http://stackoverflow.com/questions/5997995/in- net-4-0-how-do-i-sandbox-an-in-memoria-assembly-and-execute-a-metodo) –

+0

La tua domanda fa riferimento al tag 'scripting'. Hai intenzione di compilare in modo dinamico il tuo codice .NET o in che modo questo tag si applica alla tua situazione? –

risposta

9

Sì, questo è possibile. Utilizzo di Code Access Security e .NET Sandbox. Ti consiglio di dare un'occhiata alla libreria CSScript (open source). Questa è una libreria che fornisce script C# e compilazione al volo in assembly dinamici. Ho usato questo in un progetto per consentire agli utenti finali di scrivere script C# ed eseguirli consentendo l'interazione con le classi nel mio sistema. Il progetto richiedeva che non avessero accesso a File IO o MessageBox (UI) poiché gli script utente dovevano essere eseguiti su un server. CSSCript ha usato elementi del framework .NET per limitare l'accesso al gruppo e si otterrà un'eccezione se viene chiamato uno di questi tipi proibiti.

Quindi, dai un'occhiata a quello. Modificherò la mia risposta una volta che troverò qualche dettaglio in più su come è possibile, solo per farvi sapere che è possibile!


Ok trovato. Qui è una discussione che ho avuto con l'autore di CSScript a pochi anni fa:

Me:

Sto sviluppando un'applicazione e si desidera esporre la possibilità per gli utenti di script di determinate azioni tramite l'interfaccia utente. CSScript sembra molto buono per questo. Tuttavia, desidero anche consentire agli utenti di fare ciò ed eseguire i loro script su un server web. Ora questo è un incubo per la sicurezza dato che gli utenti possono scrivere "Directory.Delete (@" C: \ ", true)" e cancellare il disco rigido. Sarebbe quindi possibile limitare gli assembly, gli spazi dei nomi o anche le classi a cui un utente può accedere dal proprio script, in modo da eseguire il CSScript in una sandbox sicura?

Oleg:

La soluzione interessante immediato è quello di utilizzare .NET Sandbox. È progettato esattamente per questo tipo di scenari. Il sandbox standard CLR è disponibile per l'applicazione host che esegue script con CS-Script. L'idea è di inizializzare CAS prima di caricare lo script sospetto e il resto è una responsabilità CLR. E se hai bisogno di configurare le autorizzazioni di directory/file lo fai con gli strumenti CAS. In questo modo lo scripting è un "trasporto" per la routine fornita dal tuo utente. E CS-Script è un meccanismo conveniente per implementare questo tipo di trasporto, ma i problemi di sicurezza attuali sono affrontati da .NET Sendoxing, che ha un set completo di funzionalità per coprire praticamente tutti i possibili scenari di sicurezza. Con i downloadables CS-script è possibile trovare nell'esempio di Sendboxing (\ Samples \ Sandboxing) che dimostra come impedire lo script dalle operazioni di I/O di file (ad esempio creare il file).

Quindi, da questo credo che sia necessario guardare .NET Sandbox e caricare gli assembly in questo. Mi rendo conto che questo esempio è specifico per C# Scripting ma credo che sia applicabile al tuo scenario in quanto gli esempi CSScript sopra ti mostreranno un modo per ottenere sandbox e sicurezza.

Alcuni esempi specifici di come caricare assembly in una sandbox può essere trovato qui:

Mentre stiamo discutendo caricamento del modulo, hanno hai sentito parlare di Microsoft Prism? Ciò fornisce un buon framework per il caricamento dei moduli e l'iniezione delle dipendenze (tramite Unity o MEF) che potrebbe essere molto utile quando si sviluppa un'architettura di plugin.

Con i migliori saluti,

+0

Grazie per le informazioni, controllerò quelle fuori domani (3:00 qui!) Ho cercato di ottenere la risposta da [Qui] (http://stackoverflow.com/questions/5997995/in-net-4- 0-how-do-i-sandbox-un-in-memoria-assembly-ed-execute-a-metodo) funziona ma quando provo a caricare il mio modulo dice che non può trovarlo o uno se si tratta di dipendenze. Spero che domani possa capire qualcosa con tutti i link che mi avete mandato. – BoJaN