Seite 1 von 1
Liste oder Dict sicher durchs Internet
Verfasst: Freitag 3. Juli 2009, 17:39
von Andyh
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
Verfasst: Freitag 3. Juli 2009, 17:57
von 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.
Verfasst: Freitag 3. Juli 2009, 19:04
von Andyh
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
Verfasst: Freitag 3. Juli 2009, 20:19
von 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.
Verfasst: Samstag 4. Juli 2009, 13:03
von Andyh
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
Verfasst: Samstag 4. Juli 2009, 13:23
von cofi
Verfasst: Samstag 4. Juli 2009, 13:32
von 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.
Verfasst: Samstag 4. Juli 2009, 22:09
von DasIch
Wenn man schon unbedingt Python Code für die Daten verwendet dann sollte man den mit
ast.literal_eval ausführen.
Verfasst: Sonntag 5. Juli 2009, 08:24
von sma
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
Verfasst: Sonntag 5. Juli 2009, 08:45
von Andyh
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
Verfasst: Sonntag 5. Juli 2009, 10:05
von sma
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
Verfasst: Sonntag 5. Juli 2009, 10:18
von Dauerbaustelle
Andyh, hör doch endlich hin: JSON! Wo ist denn das Problem?!
Verfasst: Sonntag 5. Juli 2009, 10:20
von cofi
Andyh hat geschrieben:Ich muss mit Python 2.5 auskommen mit der stdlib
Da ... mensch Dauerbaustelle les doch endlich

SCNR
Verfasst: Sonntag 5. Juli 2009, 10:23
von Dauerbaustelle
: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ß
Verfasst: Sonntag 5. Juli 2009, 11:30
von Leonidas
cofi hat geschrieben:Andyh hat geschrieben:Ich muss mit Python 2.5 auskommen mit der stdlib
Da ... mensch Dauerbaustelle les doch endlich

SCNR
Wobei das das ohne Begründung ja ziemlicher Quatsch ist. Warum nur auf stdlib beschränken?
Verfasst: Sonntag 5. Juli 2009, 11:36
von snafu
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).
Verfasst: Sonntag 5. Juli 2009, 12:04
von Dauerbaustelle
Pythonmodule kann man aber auch ohne Installation nutzen...
Verfasst: Sonntag 5. Juli 2009, 12:08
von cofi
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.
Verfasst: Sonntag 5. Juli 2009, 12:38
von jerch
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.