Erstens.. ein paar fehlende Anwendungsfälle hier, wenn wir über Möglichkeiten, anonymen Code zu injizieren sprechen
code.compile_command()
code.interact()
imp.load_compiled()
imp.load_dynamic()
imp.load_module()
__builtin__.compile()
loading C compiled shared objects? example: _socket?)
Aber die eigentliche Frage ist, was ist Ihr Ziel - versuchen Sie, eine Art von Sicherheit zu erzwingen? Oder sind Sie nur daran interessiert, was geladen wird.
Wenn Sie interessiert sind an Sicherheit ist der Dateiname, der über exec/execfile importiert wird, unerheblich - Sie sollten rexec die Folgendes bietet:
Dieses Modul enthält die die r_eval(), r_execfile() unterstützt, r_exec() und r_import() unterstützt, die sind eingeschränkte Versionen der Standard Python-Funktionen eval(), execfile() und die Anweisungen exec und import. Code der in dieser eingeschränkten Umgebung ausgeführt wird ausgeführt wird, hat nur Zugriff auf Module und Funktionen, die als sicher eingestuft sind; Sie können Unterklasse RExec ad nach Belieben.
Wenn es sich jedoch eher um eine akademische Beschäftigung handelt, finden Sie hier ein paar verrückte Ansätze, die Sie die Sie vielleicht ein wenig vertiefen können
Beispiel-Skripte:
./deep.py
print ' >> level 1'
execfile('deeper.py')
print ' << level 1'
./deeper.py
print '\t >> level 2'
exec("import sys; sys.path.append('/tmp'); import deepest")
print '\t << level 2'
/tmp/deepest.py
print '\t\t >> level 3'
print '\t\t\t I can see the earths core.'
print '\t\t << level 3'
./codespy.py
import sys, os
def overseer(frame, event, arg):
print "loaded(%s)" % os.path.abspath(frame.f_code.co_filename)
sys.settrace(overseer)
execfile("deep.py")
sys.exit(0)
Ausgabe
loaded(/Users/synthesizerpatel/deep.py)
>> level 1
loaded(/Users/synthesizerpatel/deeper.py)
>> level 2
loaded(/Users/synthesizerpatel/<string>)
loaded(/tmp/deepest.py)
>> level 3
I can see the earths core.
<< level 3
<< level 2
<< level 1
Natürlich ist dies eine ressourcenintensive Methode, denn Sie würden Ihren gesamten Code. Nicht sehr effizient. Aber, ich denke, es ist ein neuer Ansatz da er auch dann noch funktioniert, wenn man tiefer in das Nest eindringt. Man kann 'eval' nicht außer Kraft setzen. Obwohl Sie kann Überschreiben Sie execfile().
Beachten Sie, dass dieser Ansatz nur exec/execfile abdeckt, nicht "import". Für 'Modul'-Load Hooking auf höherer Ebene können Sie vielleicht verwenden sys.path_hooks (Bericht mit freundlicher Genehmigung von PyMOTW).
Das ist alles, was ich aus dem Stegreif weiß.