17.1 rexec -- Infrastruttura per l'esecuzione limitata

Modificato nella versione 2.3: Disabled module.

La documentazione è stata lasciata per aiutare nella lettura di vecchio codice che utilizza questo modulo.

Questo modulo contiene la classe RExec, che supporta i metodi r_eval(), r_execfile(), r_exec() e r_import(), che sono versioni limitate delle funzioni standard Python eval(), execfile() e delle istruzioni exec ed import. Il codice eseguito in questo ambiente limitato avrà accesso solamente ai moduli ed alle funzioni che vengono considerate sicure; potete derivare RExec per aggiungere o rimuovere le funzionalità che desiderate.

Anche se il modulo rexec è disegnato per comportarsi come descritto sotto, esso possiede alcune vulnerabilità note che potrebbero venire sfruttate da codice scritto a proposito. Perciò non dovreste farvi affidamento in situazioni che richiedono sicurezza ``pronta per la produzione''. In queste situazioni, può essere necessaria l'esecuzione tramite sotto processi o un attento ``cleansing'' di entrambi i codici e dei dati da elaborare . Alternativamente, sarà molto apprezzato l'aiuto nel correggere le vulnerabilità note di rexec.

Note: La classe RExec può impedire che il codice effettui operazioni non sicure come leggere o scrivere file su disco o utilizzare socket TCP/IP. Comunque, non protegge da codice che utilizza grandi quantità di memoria o tempo del processore.

class RExec( [hooks[, verbose]])
Restituisce un'istanza della classe RExec.

hooks è un'istanza della classe RHooks o di una sua sotto classe. Se viene omessa o è None, viene istanziata la classe predefinita RHooks. Ogni volta che il modulo rexec cerca un modulo (anche uno built-in) o legge il codice di un modulo, non utilizza realmente il file system da sè. Piuttosto, richiama i metodi di un'istanza RHooks che è stata passata al costruttore o creata da questo. (In realtà l'oggetto RExec non effettua queste chiamate -- queste vengono eseguite da un oggetto loader a livello di modulo che è parte dell'oggetto RExec. Questo permette un diverso livello di flessibilità, che può essere utile quando si cambia il meccanismo di import in un ambiente limitato).

Fornento un oggetto RHooks alternativo, possiamo controllare gli accessi al file system effettuati per importare un modulo, senza modificare il vero algoritmo che controlla l'ordine in cui questi accessi vengono effettuati. Per esempio, potete sostituire un oggetto RHooks che passa tutte le richieste del filesystem ad un file server, attraverso qualche meccanismo RPC, come ILU. Il loader delle applet di Grail utilizza questo tecnica per supportare l'import delle applet da un URL per una directory.

Se verbose è vero, vengono generate informazioni addizionali di debug sullo standard output.

È importante sapere che il codice in esecuzione in un ambiente limitato può ancora chiamare la funzione sys.exit(). Per non permettere al codice limitato di terminare l'interprete, proteggete sempre le chiamate che eseguono codice limitato con un'istruzione try/except che intercetti l'eccezione SystemExit. Rimuovere la funzione sys.exit() dall'ambiente limitato non è sufficiente - il codice limitato può ancora usare raise SystemExit. Rimuovere SystemExit non è un'opzione ragionevole; alcuni codici di libreria ne fanno uso e non funzionerebbero senza.

Vedete anche:

Grail Home Page
Grail è un browser web scritto interamente in Python. Utilizza il modulo rexec come base per supportare applet Python e può essere visionato come esempio di utilizzo di questo modulo.



Subsections
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.