eval() ?!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hi,

ok, jetzt hab ich's. Ich hatte es so aufgefasst, als ob Du eine Liste speicherst und diese als String wieder eingelesen wird. Na denn: Problem gelöst, weil keines da! :oops:

Christian
Gast

hi
ok, jetzt hab ich's. Ich hatte es so aufgefasst, als ob Du eine Liste speicherst und diese als String wieder eingelesen wird. Na denn: Problem gelöst, weil keines da!
und wie es da ist, ggg, nur ein anderes eben, macht aber nichts

noch ne frage an alle, es gibt doch die möglichkeit, eine liste aller verfügbaren module zu bekommen, oder? wie geht das gleich nochmal?

und wenn ja, und ich alle module ausschliesse, dann gibts wohl kein sicherheitsproblem mehr,

also würde zuerst getest werden ob [,{ usw enthalten ist, dann muss noch sicher gestellt werden, dass kein os,sys,cgi. popen, also einfach auf kein modul zugegriffen wird.

was denkt ihr?

mfg

rolgal
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

rolgal hat geschrieben:noch ne frage an alle, es gibt doch die möglichkeit, eine liste aller verfügbaren module zu bekommen, oder? wie geht das gleich nochmal?
Geht nicht. Du müsstest sys.path durch alle *.py's und *.pyc's und *.pyw's auch auch alle Verzeichnisse wo eine __init__.py drin ist durchsuchen. Aber sogar das wäre nicht so grandios sicher.Vielleicht kannst du irgendwo im "imp" Modul einhaken.
rolgal hat geschrieben:und wenn ja, und ich alle module ausschliesse, dann gibts wohl kein sicherheitsproblem mehr,

also würde zuerst getest werden ob [,{ usw enthalten ist, dann muss noch sicher gestellt werden, dass kein os,sys,cgi. popen, also einfach auf kein modul zugegriffen wird.

was denkt ihr?
Ich würde mich darauf nicht verlassen. Diese Lösung scheint mir irgendwie abenteuerlich zu sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

hi leonidas,

danke für deine einschätzung, scheint wohl schwieriger zu sein als ich dachte

mfg

rolgal
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

rolgal hat geschrieben:danke für deine einschätzung, scheint wohl schwieriger zu sein als ich dachte
Du bist ja nicht der erste, der sowas versucht, es gab ja schon Bastion und rexec, die beide gescheitert sind, obwohl sich durchaus fähige Leute drangesetzt haben.

Siehe auch Restricted Execution.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

hi leonidas,

noch bin ich stur, an das habe ich in etwa gedacht:

Code: Alles auswählen

>>> import sys
>>> my_modules=sys.modules
>>> l="[sys.exit(1)]"
>>> l
'[sys.exit(1)]'
>>> my_modules=my_modules.keys()
>>> for element in my_modules:
	if element in l:
		print element, "gefunden, daher nicht erlaubt"

		
sys gefunden, daher nicht erlaubt
>>> 
somit habe ich doch alle module ausgeschlossen, und ich muss doch auch nicht mehr andere .py etc durchforsten oder?

mfg

rolgal
Gast

tja, aber es werden nicht alle module gelistet, so findet sich zwar os, aber nicht popen2 in der liste,

net guat :?

mfg

rolgal
Gast

semmel, hat wohl irgendwas nicht funktioniert, popen2 ist schon drin.

ne, doch nicht, nur weil ich es mal importiert hatte und die anweisungen wie oben nochmal ausgeführt habe.



echt ne nuss:

vereinfacht was passiert ist:

Code: Alles auswählen

>>> import sys
>>> my_modules=sys.modules
>>> my_modules=my_modules.keys()
>>> 'os' in my_modules
True
>>> 'popen2' in my_modules
False
>>> import popen2

>>> my_modules=sys.modules
>>> my_modules=my_modules.keys()
>>> 'popen2' in my_modules
True
>>> 

mfg

rolgal
BlackJack

Python ist einfach zu "mächtig" und flexibel. Hast Du Dir schonmal überlegt, das auch jemand folgendes machen kann:

Code: Alles auswählen

eval('s'+'ys.exit()')
Und schon findest Du kein 'sys' mehr. Die Zeichenkette kann man beliebig komplex "verschlüsseln".

Wenn nur Grundlegende Typen in der Liste vorkommen dann hilft vielleicht Michael Spencer's "Safe" Eval Rezept im Cookbook weiter. Das parst beliebig verschachtelte Listen, Tupel und Dictionaries mit konstanten Werten darin. Also nix ausführbares.
Gast

hi blackjack,

ja, du hast natürlich völlig recht. bei deinem bsp. wäre der ganze aufwand den ich betreiben wollte umsonst.

ich komme auf solche böse :evil: ideen nicht liegt wohl daran, dass ich die unschuld in person bin :oops:

spass beiseite: das bsp das du mir empfohlen hast habe ich mir mal angesehen und bin mal zuerst gar nicht dahintergestiegen. :roll:

mal sehen, ob ich damit weiterkomme,

vielen dank auf jeden fall

mfg

rolgal
Antworten