Liste oder Dict sicher durchs Internet

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.
Antworten
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Ich habe ein Sicherheitsproblem:
Ich gebe eine anfrage an meinen Server und der gibt dann eine List zurück die ich mit "eval" wieder lesbar mache. Das ganze passiert nämlich mit urllib2 und da kommt ja nur Text durch.

An der Methode mit urllib kann ich nicht machen, muss so bleiben, nur eval muss weg.

Wie würdet ihr das machen?

Hier mal ein Beispiel:
[{"projekt" : "test", "Version" : 1.0}, {"projekt" : "test1", "Version" : 1.1}]

XML währe sicher was, aber ich kenne mich da noch gar nicht aus, ein Beispiel währe gut, wenn xml das richtige ist.

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
lunar

JSON empfiehlt sich hier, XML lohnt sich imho nur, wenn man komplexere Abfrage über XPath durchführen oder an eine XML-Umgebung gebunden ist.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo
DANKEE!!!
Da mir Json nicht zur Verfügung steht habe ich marshal genommen.

Jetzt ist das endlich richtig gemacht, man kann ja kein dict in eine string umwandeln und dann das ganze durch das web schicken um am Schluss wieder mit eval das ganze ein einzulesen.

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
lunar

RTFM:
The marshal module is not intended to be secure against erroneous or maliciously constructed data. Never unmarshal data received from an untrusted or unauthenticated source.
"marshal" ist nach eval so ziemlich die schlechteste Wahl, die man treffen kann.
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

oha, naja eine Stufe besser ist es ja mal, die Dateien bereite ich auf dem Server mit marshal auf, dann müsste das schon gut gehen?

Ich denke pickle oder cpickle ist da auch nicht besser.

Gibt es denn sonst noch alternativen?

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

lunar

marshal ist nicht besser als eval! Weder marshal noch pickle sind geeignete Formate für den Datentransfer über unsichere Kanäle, die Warnungen in der Dokumentation sind nicht umsonst da, und du solltest diese Warnungen auch ernst nehmen.

Alternativen sind XML, JSON und YAML.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Wenn man schon unbedingt Python Code für die Daten verwendet dann sollte man den mit ast.literal_eval ausführen.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Das "Sicherheitsproblem" lässt sich doch auch durch Vertrauen lösen, oder? In diesem Fall könnte eine SSL-Verbindung benutzen, bei der man die Zertifikate prüft, um so nur mit vertrauenswürdigen Clients bzw. Servern zu reden.

Eine andere Idee wäre, wenn Client und Server ein "shared secret" kennen (also z.B. eine AES-128-Schlüssel), die Nachrichten mit einem HMAC zu versehen. Dann kann sie zwar jeder lesen, aber nicht ändern, ohne dass es auffällt.

Stefan
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

@DasIch:
ast.literal_eval hört sich doch gut an, aber auch wieder nicht. Ich muss mit Python 2.5 auskommen mit der stdlib

@sam
Das Sicherheitsproblem wie du es beschreibst besteht dahingehend nicht weil das Programm nur mit meinem Server redet. Ich habe einfach nur angst eine Schnittstelle ins Internet einzubauen die Python-Code ausführt.

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Andyh hat geschrieben:Das Sicherheitsproblem wie du es beschreibst besteht dahingehend nicht weil das Programm nur mit meinem Server redet. Ich habe einfach nur angst eine Schnittstelle ins Internet einzubauen die Python-Code ausführt.
und genau dieser Angst kannst du mit Vertrauen begegnen. Das halte ich für den prinzipiell besten Weg. Denn auch JSON oder XML können Daten enthalten, die das verarbeitende Programm dermaßen aus dem Tritt bringen, dass es Schaden anrichtet. Vertrauen schließt Änderungen durch unbekannte Dritte aus.

Stefan
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Andyh, hör doch endlich hin: JSON! Wo ist denn das Problem?!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Andyh hat geschrieben:Ich muss mit Python 2.5 auskommen mit der stdlib
Da ... mensch Dauerbaustelle les doch endlich :twisted: SCNR
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

:D

Hey, das glaube ich nicht ;-)

Und wenn doch, schreib dir halt nen JSON-Parser, das ist ja nicht wirklich schwer (es gibt ja nur Listen, Dicts, Strings, Floats, Ints).

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

cofi hat geschrieben:
Andyh hat geschrieben:Ich muss mit Python 2.5 auskommen mit der stdlib
Da ... mensch Dauerbaustelle les doch endlich :twisted: SCNR
Wobei das das ohne Begründung ja ziemlicher Quatsch ist. Warum nur auf stdlib beschränken?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6880
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ein denkbarer Fall wäre, dass man keine Pythonmodule nachinstallieren kann (z.B. weil man keine Admin-Rechte bekommt). Oder man will in jedem Fall Abhängigkeiten zu Drittpaketen vermeiden. Bei letzterem stellt sich aber natürlich die Frage, wie lange diese Schiene gut geht (offenbar jetzt ja nicht mehr so wirklich).
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Pythonmodule kann man aber auch ohne Installation nutzen...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Leonidas hat geschrieben:Wobei das das ohne Begründung ja ziemlicher Quatsch ist. Warum nur auf stdlib beschränken?
Nunja eventuell ist es eine Aufgabenstellung - die koennen schliesslich besonders bloed ausfallen ;)
Mehr als die Alternativen koennen wir ja auch nicht anbieten, wenn er nicht will, dann will er nicht.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Gerade aus dem Sack voll JSON-Libs ließe sich bestimmt eine passende finden, die man einfach mit dem Programm ausliefert. Man muß ja nicht immer alles neu erfinden.

Zur Sicherheit:

@Andyh
Je nach dem, wie wichtig der Sicherheitsaspekt für Deine Anwendung ist, solltest Du weitere Maßnahmen ergreifen (sma hat schon darauf hingewiesen). Denn egal ob JSON, pickle oder was auch immer Du nutzt, solange ein unsicheres Transportmedium dazwischen hängt, kannst Du der Quelle nicht mehr vertrauen. Auch wenn die Quelle primär vertrauenswürdig ist, könnte ein man-in-the-middle das Ganze manipuliert an Server/Client weitergeben.
Und mit Deinem marshal-Ansatz lieferst Du die Steilvorlage für Code-Injections.
Antworten