2013-03-13 9 views
7

Se il mio codice utilizza moduli di terze parti che non può essere attendibile, c'è qualcosa per evitare che la situazione in questo modo:Protezione moduli importati di essere corrotto dal codice di terze parti

UntrustedModule.py:

import random 

random.random = lambda : 4 

MyModule .py:

import random 
import UntrustedModule 

print (random.random()) 

dove la semplice importazione di questo modulo interrompe le ipotesi su altre, non correlate?

+6

I moduli non attendibili possono fare molto di più che sostituire solo le funzioni e così via. Non eseguire moduli non fidati. –

+2

Questa modifica sembra corretta (vedi http://xkcd.com/221/). ;) – Matthias

+0

Python non è progettato per impedirlo. Se questo è un requisito, starai meglio usando un linguaggio (come Lua o Javascript) o creando uno schema di sandboxing che esegua i moduli in un altro processo. – millimoose

risposta

5

No, non si può avere alcuna garanzia di questo tipo in Python, almeno non nell'implementazione di CPython. Quando si importa un modulo, il suo codice viene eseguito e dispone di accesso completo in ogni parte dell'interprete (e probabilmente in grandi parti del sistema). Non c'è modo di evitare questo. Non è saggio caricare mai codice non fidato, perché c'è così tanto che può fare.

Tuttavia potresti essere interessato a eseguire il processo in un processo isolato e comunicare solo con esso tramite IPC. Questo è un argomento enorme e dipende dal grado di isolamento di cui hai bisogno e da quanto ti fidi del codice esterno.


PyPy implementa alcuni sandboxing features. Non è così semplice come "attivare il sandboxing", ma è uno dei tanti modi per isolare il codice non attendibile.

-1

Si può fare un

reload(random) 

per ricaricarlo dal resp fonte. per ripristinarlo come dovrebbe essere.

+0

cosa c'è di sbagliato in questa risposta? – glglgl

+0

Immagino sia preoccupante che le questioni di sicurezza siano trascurate, in quanto OP stava parlando di "codice non attendibile". –

+0

(Il codice non attendibile potrebbe essere inserito nel macchinario di importazione stesso e rendere inutile il ricaricamento) –

-1

Python eseguirà l'importazione nell'ordine di ricerca del percorso locale (la directory da cui è stato eseguito lo script), quindi di tutti i percorsi elencati nella variabile di ambiente PYTHONPATH.

Una soluzione migliore sarebbe quella di ispezionare e scrivere test sul modulo non attendibile.

+2

"Una soluzione migliore sarebbe quella di ispezionare e scrivere test sul modulo non attendibile." - non proprio. Significa solo che stai scommettendo che sei più intelligente dei potenziali attaccanti. – millimoose

+0

@millimoose: da qui l'ispezione. Se il modulo è veramente non affidabile, è meglio non utilizzarlo. –

Problemi correlati