2009-08-29 14 views

risposta

0

È possibile sovraccaricare il meccanismo di importazione. Abbiamo usato questo per avere un sistema di licenze per i plugin, puoi facilmente avere una whitelist/lista nera dei nomi dei moduli.

+8

Questa risposta ha bisogno di un esempio per essere di qualsiasi uso – Schollii

1

Sfortunatamente, penso che ciò che stai cercando di fare sia fondamentalmente impossibile. Se gli utenti possono eseguire codice arbitrario nella tua applicazione, allora possono fare tutto ciò che vogliono. Anche se tu fossi in grado di impedire loro di importare determinati moduli, non ci sarebbe nulla che li impedisse di scrivere funzionalità equivalenti (da zero o utilizzando alcuni dei moduli disponibili).

Non conosco le specifiche di implementazione di una sandbox in Python, ma immagino che sia qualcosa che deve essere fatto a livello di interprete ed è tutt'altro che facile!

+0

quello che sta cercando di fare è estremamente difficile, ma tutt'altro che impossibile. Se si progetta abbastanza bene su ciò che si sta facendo, è possibile strozzare l'accesso al proprio back-end e limitarlo, dando accesso solo a ciò che è consentito vedere e limitando l'accesso alle implementazioni hacky consentite da python. (ci sono molte aree di restrizione che devono essere coperte, dagli spazi dei nomi privati ​​dei backend, alle operazioni con variabili limitate) – Tcll

13

Avete controllato python.org article on SandboxedPython e linked article?

Entrambe queste pagine hanno collegamenti ad altre risorse.

In particolare, RestrictedPython di PyPi consente di definire esattamente ciò che è disponibile e ha alcuni valori predefiniti 'sicuri' tra cui scegliere.

+0

Avrei dovuto accennare, la mia app funziona su Google App Engine. Quindi, da un lato ho già un sacco di sandboxing, ma OTOH non sono sicuro di poter usare RestrictedPython. Farò sicuramente un tentativo, grazie! –

7

L'open source di Google App Engine SDK ha un'implementazione dettagliata e solida della meccanica per arrestare l'importazione di moduli indesiderati (per aiutare a rilevare il codice cercando di importare moduli non resi disponibili nelle istanze di produzione di App Engine), sebbene anche questo potrebbe essere sovvertito se il codice utente fosse malvagio piuttosto che errato (le istanze di produzione hanno ovviamente più livelli di difesa, come semplicemente non avere affatto quei moduli in giro ;-).

Quindi tutto dipende da quanto deve essere approfondita la tua difesa. Ad un estremo si nasconde da qualche parte l'integrato __import__ e lo si sostituisce con la funzione che esegue tutti i controlli desiderati prima di delegare allo __builtin__; sono forse 20 righe di codice, 30 minuti da implementare e testare a fondo ... ma potrebbe non proteggerti a lungo se qualcuno offrisse in modo credibile me un milione di dollari per irrompere nel tuo sistema (e, ipoteticamente, non ero il certo tipo di ragazzo in realtà sono AM, ovviamente ;-). All'altro estremo si distribuisce una serie approfondita di livelli di difesa che potrebbero richiedere migliaia di righe e settimane di implementazione e test di lavoro - dato quel tipo di budget di risorse potrei sicuramente implementare qualcosa I non sarebbe in grado di penetrare (ma c'è sempre il rischio che qualcuno sia ELSE più intelligente e più esperto di Python di me, naturalmente!).

Quindi, quanto in profondità vuoi andare, o meglio, quanto in profondità puoi andare ...?

+0

Sono lontano dai requisiti/budget del livello NSA, quindi suppongo che opterò per l'override di __import__ e se noleggi l'autore di The Python Cookbook un milione di dollari per rompere la protezione, ne sopporterò le conseguenze .. Eventuali puntatori come fare per farlo? Essendo relativamente nuovo a Python, non riesco a trovare una soluzione semplice. Grazie! –

+0

Le istanze di produzione di App Engine sono saldamente protette, come ho detto con molti livelli di difesa: non saprei come penetrare in QUELLI (se lo facessi, ovviamente lo comunicherei privatamente al mio datore di lavoro, o ai miei molti amici chi lavora nel team App Engine, quindi la perdita verrà risolta immediatamente dopo averlo capito ;-). Considera solo che, proprio come il tuo codice può sovrascrivere "__import__", così il codice che stai importando può essere difeso anche da THAT; E, usa una posizione di "default deny", dove sono permessi solo moduli specifici, piuttosto che quelli specifici proibiti! -) –

+0

Supponendo che il codice discutibile venga aggiunto al programma in esecuzione come una stringa che il programma eseguirà "exec", wouldn È impossibile che questo codice importi nuovi moduli se il programma è stato fornito in pyinstaller e quindi non ha effettivamente accesso ai moduli che non sono importati dal programma principale perché i file non sono inclusi nell'eseguibile? –

18

Se si mette Nessuno in sys.modules per un nome del modulo, in non sarà importabile ...

>>> import sys 
>>> import os 
>>> del os 
>>> sys.modules['os']=None 
>>> import os 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named os 
>>> 
+1

Funziona anche prima di importare il modulo attuale. –

+1

@DoktoroReichard Ermm ..., questo è quello che sta dimostrando ('del os') ... – idmean

0

otto anni, Yeesh, e nessuno ha capito questo fuori? :/

È possibile ignorare l'istruzione import o la funzione __import__.

questo è solo un testata scarabocchio-codice, perché non riuscivo a trovare alcun riferimento legit:

import importlib 

def secure_importer(name, globals=None, locals=None, fromlist=(), level=0): 

    if name != 'C': print(name, fromlist, level) 

    # not exactly a good verification layer 
    frommodule = globals['__name__'] if globals else None 
    if name == 'B' and frommodule != 'C': 
     raise ImportError("module '%s' is restricted."%name) 

    return importlib.__import__(name, globals, locals, fromlist, level) 

__builtins__.__dict__['__import__'] = secure_importer 

import C 

e 'qui il test per quel codice:

Python 3.4.3 |Anaconda 2.3.0 (32-bit)| (default, Mar 6 2015, 12:08:17) [MSC v.1600 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> ================================ RESTART ================================ 
>>> 
B ('f',) 0 
imported secure module 
>>> from B import f 
B ('f',) 0 
linecache None 0 
encodings.utf_8 ['*'] 0 
Traceback (most recent call last): 
    File "<pyshell#0>", line 1, in <module> 
    from B import f 
    File "\home\tcll\Projects\python\test\restricted imports\main.py", line 11, in secure_importer 
    raise ImportError("module '%s' is restricted."%name) 
ImportError: module 'B' is restricted. 
>>> import C 
>>> 

prega di non commentare su di me usando Python34, ho le mie ragioni, ed è il mio interprete principale su Linux specificamente per testare cose (come il codice precedente) per il mio progetto principale.

Problemi correlati