alles klar, hauptsache ich weiss was du gemeint hast
was glaubst du bzw ihr: wenn ich
Code: Alles auswählen
eval()
Code: Alles auswählen
sys
Code: Alles auswählen
os
mfg
rolgal
Code: Alles auswählen
eval()
Code: Alles auswählen
sys
Code: Alles auswählen
os
Jop. Ich kann zum Beispiel über die Module popen2,subprocess,cgi und einige andere denselben schaden anrichten. Außerdem kann ja auch anderes importiert wurden sein, also das ist viel zu unsicher. Benutz eval nur, wenn du sicher bist, dass keine Informationen von woanders außerhalb des Programmes als Argumente eingeschleust werden können.rolgal hat geschrieben:oder gibt es einfach zuviele andere anweisungen die dann noch schaden anrichten könnten?
ok, verstehe ich so in etwa, aberdoch, schau mal genau hin: Mein Pseudo Code entspricht dem Code im Snippet: "protocol" kann Werte zwischen 0 und 2 annehmen. 0 ist ASCII, 1 entspricht einem binären Protokoll und 2 dem neuen binären Protokoll mit dem sich auch Newstyle-Klassen picklen lassen. Im Allgemeinen kann man ab Python 2.3 alle Protkolle verwenden (von Ausnahmen abgesehen). Protokoll 2 ergibt die stärkste Kompression.
ich will aber einen string, bzw. muss einen string picklen und brauche eine liste. vielleicht sitze ich ja auf der leitung
Zu der Geschichte mit data = "[1,2,3]": Nun, hier gibst Du einen String und picklest diesen. Was Du herausbekommst ist ein String. Versuche mal eine Liste oder eine Klasseninstanz zu picklen ...
kein problem, besteht ja keine verpflichtung zu antworten. zu pickle: ich finds es gut
Tut mir leid, daß ich nicht eher geantwortet habe. Ging nicht anders. Schaue mal in die Doku - pickle habe ich auch erst so richtig zu schätzen gewußt als ich die ersten Beispiele gesehen habe.
und wie es da ist, ggg, nur ein anderes eben, macht aber nichtsok, 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!
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: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?
Ich würde mich darauf nicht verlassen. Diese Lösung scheint mir irgendwie abenteuerlich zu sein.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?
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.rolgal hat geschrieben:danke für deine einschätzung, scheint wohl schwieriger zu sein als ich dachte
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
>>>
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
Code: Alles auswählen
eval('s'+'ys.exit()')