Code per Netzwerk übertragen

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
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Hallo,

Folgende Funktion, welche mitunter auch von globalen Namen abhängig ist:

Code: Alles auswählen

def func(arg1, arg2):
    a = arg1.get('something')
    do_something(arg2)
    ...
...würde ich gerne, so wie sie ist, über ein Netzwerk übertragen, bzw. ich möchte sie nicht direkt in den Quellcode einbauen, sondern importieren. Allerdings möchte ich nicht auf externe Quellen im Dateisystem wie Module oder ähnliches zurückgreifen. Bis jetzt hatte ich nur mit Listen, Dictionaries usw. gearbeitet und die mit pickle und base64 übertragen. Aber mit Funktionen weiß ich nun nicht weiter. Hat eventuell jemand eine Idee, wie ich das vielleicht sogar in Verbindung mit pickle lösen könnte?
BlackJack

@Gremlin: Falls ich das richtig verstanden habe, dann kannst Du das vergessen. Du könntest Dir mal Pyro (Python Remote Objects) anschauen, aber auch da muss AFAIK der Code selbst schon vorher auf beiden Seiten der Verbindung bekannt sein.

Was ist denn das eigentliche Problem, dass Du lösen willst?
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Mein Programm lädt diverse Dateien herunter. Diese Dateien müssen mitunter zum Teil noch weiter verarbeitet werden da ich aber nicht weiß was genau und ich nicht jedes mal ein Update rausbringen möchte, dachte ich mir ich übertrage die entsprechenden Anweisungen mit den Informationen die ich zum Download brauche. Und diese Infos pickle ich momentan. (Und übertrage sie dann in einem base64 kodierten String.)

Edit: Und zu Pyro, dass bringt mir leider auch nichts, auch wenn es durchaus interessant ist. Denn ich habe keine Möglichkeit auf dem Server der die Daten bereit stellt Python auszuführen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

kannst du das nicht irgendwie über RPC lösen?

Gruß, noisefloor
schorsch
User
Beiträge: 18
Registriert: Montag 26. November 2007, 18:39

Wenn auf dem Server kein Python laufen darf fällt RPC auch raus, es sei denn, du willst eine andere Sprache nutzen, die dort erlaubt ist.

Wenn du deine Idee 1:1 umsetzen willst könntest du folgendes machen: Übertrage den Quelltext der neuen Funktion per Netzwerk an die Anwendung; diese schreibt die Funktion in eine Moduldatei, die von deinem Programm importiert wird; auf die Funktion kannst du dann mit getattr zugreifen.

Aber ich denke da gibt es eine bessere Möglichkeit, wenn man sich nicht auf dieses Vorgehen versteift
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
schorsch hat geschrieben:Wenn auf dem Server kein Python laufen darf fällt RPC auch raus, es sei denn, du willst eine andere Sprache nutzen, die dort erlaubt ist.
Auf dem Server, der die Daten liefert, läuft kein Python. Auf irgendeinem Rechner muss aber Python laufen, sonst können man ja nichts per Netzwerk übertragen. ;-)

Gruß, noisefloor
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Hab mir das RPC nun mal angesehen und bin auf RPyC gestoßen, aber, mal abgesehen davon dass es Python ist, bringt mir RPC insofern nichts, weil die Daten die herunter geladen werden "direkt" verarbeitet werden müssten. Dazu gehört unter Umständen auch, dass ein Archiv entpackt werden muss.

Das mit dem Modul ist eine Möglichkeit die mir zuerst einfiel, aber das Problem das ich dabei sehe: Wie kann ich in diesem Fall sicherstellen dass das was ich da ausführe von mir stammt? Besonders weil es um Windows geht und mein Programm dauerhaft mit Admin Privilegien läuft.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was heißt denn "direkt"? Kommt es da auf jede Millisekunde an?

Ein möglicher Ansatz via RPC wäre IMHO so (wenn ich dein Problem richtig verstehe ;-) ):

* es gibt einen Server, der eine Liste von herunterzuladenden Dateien bei RPC bereit stellt sowie die Funktionen zum Verarbeiten der Datne darauf per RPC bereits stellt
* es gibt einen allg. Client, der
1. bei RPC sich die Liste der Downloads holt
2. selber herunter lädt
3. die Daten per RPC an den Server schickt, der diese dann verarbeitet und an den Client das Ergebnis schickt.

Client-Server Architektur halt.

Gruß, noisefloor
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was vergessen: in Python ist ein XML-RPC Modul enthalten -> http://docs.python.org/library/xmlrpclib.html

Gruß, noisefloor
Noah
User
Beiträge: 15
Registriert: Montag 17. Januar 2011, 08:20

Ähm.. wie wäre es, den code als string zu Übertragen und dann per exec() auszuführen?

EDIT: Frage bei StackOverflow: http://stackoverflow.com/questions/7018 ... -in-python
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Noah hat geschrieben:Ähm.. wie wäre es, den code als string zu Übertragen und dann per exec() auszuführen?
Das ist aus Sicherheitsaspekten eine wirklich schlechte Idee!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hyperion hat geschrieben:Das ist aus Sicherheitsaspekten eine wirklich schlechte Idee!
Das ist das gesamte Konzept ja schon. Wenn man den Code nicht zumindest signiert und vor dem Ausführen prüft ist jegliche Übertragung von Code über Netzwerke eine grandiose Sicherheitslücke.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Diesen Thread hab ich ja total vergessen :shock:

Aber ja, naja, zu exec: http://www.python-forum.de/viewtopic.php?f=1&t=25289 :mrgreen:
Da arbeite ich zusätzlich noch mit AES. Allerdings muss auch irgendwo der Key gespeichert werden und da bekanntlich bei Python nichts "wirklich" kompiliert wird...... Drin ists trotzdem, zumal, wer wirklich will, der kann auch andere, noch besser durchdachte Systeme irgendwie verändern/beeinflussen, oder nicht? :roll:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ja klar, ich bin davon ausgegangen dass der Key dem Angreifer nicht bekannt ist. Aber was an dem Zustand - wie du sie nennst - "wirklich" kompilierte Programme, also nativ kompilierte Programme ändern :?: :roll:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Es gibt da noch execnet als Alternative zu RPC.
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

@Leonidas
Ich sag ja, wer wirklich will, der kann auch :twisted:

@DasIch
Was mich generell an diesem Client<->Server Modell irgendwie stört, ist die Tatsache dass alles hin und hergeschoben wird. Angenommen ich möchte über den Inhalt einer Datei iterieren, dann lade ich die Datei schrittweise hoch zum Server, was ich nicht sonderlich toll finde.
Noah
User
Beiträge: 15
Registriert: Montag 17. Januar 2011, 08:20

Ich verstehe nicht, wie ihr auf RPC kommt? Er möchte doch code, der auf einem Server liegt, clientseitig ausführen. Bei RPC würde doch der Code auf dem Server ausgeführt werden, oder?

Sicherheitstechnisch ist das natürlich immer ein Problem, wenn man ausführbare Sachen von irgendwo runterlädt, z.B. schon bei Auto-Update, was sie selbst beim neuen ePerso vergeigt haben: http://janschejbal.wordpress.com/2010/1 ... utoupdate/

Wenn es also sicher sein soll:

1. Code wird serverseitig signiert
2. Code herunterladen
3. Zertifikat Prüfen (Dies muss geschehen, bevor auch nur irgendwas damit getan wird, denn selbst beim Entpacken kann mann sich ärger einhandeln)
4. Code ausführen.

Die eigentliche Frage bezog sich ja nur auf Punkt 4. Wenn es Python-Code ist, gibt es da so weit ich sehe nur 2 Möglichkeiten:

a) Abspeichern und Importieren
b) exec()

Da a) ja explizit nicht gewünscht war, bleibt ja nur noch b) übrig.


P.S.: Zu exec() wird ja immer gemahnt, dass es total unsicher sei. Kommt natürlich darauf an, was man machen will. Wenn man z.B. ein Projekt hat, wo die andere Seite (nach authentifizierung) alles machen können soll, was sie will (inklusive Festplatte löschen), dann ist exec() vollkommen OK.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

In diesem Zusammenhang könnte ja auch dieser Thread interessant sein.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Noah hat geschrieben:a) Abspeichern und Importieren
Das kann man auch eleganter Lösen, da CPython es erlaubt in die Import-Interna einzugreifen und dort eigenen Code auszuführen der etwa Module runterlädt, Signaturen prüft etc.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Hm, ja, hätte ich vielleicht erwähnen sollen dass das Problem gelöst ist? :lol:
(Denn der von Hyperion verlinkte Thread war bereits die Lösung)
Antworten