Sto scrivendo un'applicazione in cui gli utenti possono inserire uno script python ed eseguirlo in una sandbox. Ho bisogno di un modo per impedire al codice di esecuzione di importare determinati moduli, quindi il codice dannoso non sarà tanto un problema. C'è un modo per farlo in Python?Prevenire il codice Python dall'importazione di determinati moduli?
risposta
È 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.
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!
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
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.
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! –
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 ...?
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! –
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! -) –
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? –
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
>>>
Funziona anche prima di importare il modulo attuale. –
@DoktoroReichard Ermm ..., questo è quello che sta dimostrando ('del os') ... – idmean
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.
- 1. Prevenire invii duplicati di moduli
- 2. Python: Mantenere codice in moduli
- 3. Quando dividere il codice in file/moduli?
- 4. come prevenire default su keypress per determinati eventi ma poi riportare di nuovo il valore predefinito
- 5. Eliminazione di determinati file utilizzando python
- 6. Moduli Python più leggibili
- 7. È possibile trovare tutti i moduli che implementano determinati protocolli?
- 8. Python Regex Cattura solo determinati caratteri
- 9. Python enumerazioni attraverso moduli
- 10. Eliminazione dei moduli Python?
- 11. l'importazione di moduli ES6 esegue il codice all'interno del file?
- 12. Python: un elenco completo di moduli
- 13. I nosetest Python saltano determinati Test
- 14. Installazione di moduli Python per OpenERP 6.1 in Windows
- 15. organizzazione di classi e moduli in python
- 16. Prevenire il doppio voto
- 17. Importazione dinamica dei moduli Python
- 18. Prevenire il multiprocessing "bugs in fuga"
- 19. Invio di moduli con Mechanize (Python)
- 20. Importazione di moduli python in jython
- 21. Problemi nell'eliminazione di determinati oggetti JSON nidificati in python
- 22. Prevenire il click through div
- 23. Estensioni/moduli C di Python nidificati?
- 24. Prevenire la chiusura con il pulsante Indietro nei moduli xamarin su Android
- 25. moduli Python convenzione gerarchia di denominazione
- 26. Precedenza all'importazione di Python: pacchetti o moduli?
- 27. Prevenire il conflitto di pipe con nome
- 28. Trova i moduli python importati
- 29. Dove trovo il codice della libreria standard Python?
- 30. Analisi del codice Python da Python?
Questa risposta ha bisogno di un esempio per essere di qualsiasi uso – Schollii