Fragen zu Python Webprogrammierung von einem Interessenten.

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
tameritoke
User
Beiträge: 2
Registriert: Sonntag 24. Februar 2008, 06:11
Wohnort: Heidesheim am Rhein

Hi!
Ich bin eigentlich ein eingefleischter PHP5 Programmierer.

Mein Bruder träumt und stirbt für Python, und ich will jetzt auch in den
Genuss kommen. Doch sind fragen offen:

- Ich suche Frameworks für Python die genauso vom Umfang das Zeugs
liefern wie ezComponents oder dass Zend Framework.

- Ich hörte VIIEEEELL von Zope.... WAS IST ZOPE??? Ein Spplikationsserver
(Also auch ein Webserver?)

- Wenn ich ERNSTHAFT mit Python was anfangen möchte, suche ich einen
Weg, meine selbsgeschriebenen Python Skripte zu SCHÜTZEN, so dass der
Kunde nur eine Runtime Version mit einer Lizenzdatei für seine Domain
kriegt, aber keinen Einblick in die Skripte hat.

Gibt es sowas auch für Python?

Für PHP gibt es ioncube, sourceguardian, Zend Encoder die die Skripte
entschlüsseln und den entschlüsselten Code an die Zend Engine weiterreichen.

Ich frage nur, weil ich ein Produkt auf dem Markt bringe und die Skripte nach dem Verfahren schütze.

- Ich mache sehr oft in der UML meine Klassendiagramme. Gibt es ein
tool, der basierend auf der XMI Datei Roundtripp Engineering macht und
mir die Klassen mit ihren Beziehungen erstellt?

Wenn mir jemand die Fragen beantworten kann, wäre ich der/die sehr Dankbar



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

Hallo, tameritoke, willkommen im Forum,
tameritoke hat geschrieben:- Ich suche Frameworks für Python die genauso vom Umfang das Zeugs
liefern wie ezComponents oder dass Zend Framework.
Django, Pylons, TurboGears. Eigentlich kannst du die Komponenten überall verwenden, da die Frameworks WSGI unterstützen.
tameritoke hat geschrieben:- Ich hörte VIIEEEELL von Zope.... WAS IST ZOPE??? Ein Spplikationsserver
(Also auch ein Webserver?)
Ja, auch. Aber ein Webserver der fast immer hinter einem Webserver-Proxy steht. Zope braucht dich nicht zu kümmern, denn es ist recht unpythonic. Wenn du wirklich bei Zope einsteigen willst würde ich dir eher zu Grok + Repoze raten, das fühlt sich besser an.
tameritoke hat geschrieben:- Wenn ich ERNSTHAFT mit Python was anfangen möchte, suche ich einen
Weg, meine selbsgeschriebenen Python Skripte zu SCHÜTZEN, so dass der
Kunde nur eine Runtime Version mit einer Lizenzdatei für seine Domain
kriegt, aber keinen Einblick in die Skripte hat.

Gibt es sowas auch für Python?
Nein, gibt es nicht, da Python-Programmierer keine Placebos mögen. Du kannst Bytecode ausliegern, aber das ist in etwa so sicher wie derPHP Bytecode.

Für PHP gibt es ioncube, sourceguardian, Zend Encoder die die Skripte
entschlüsseln und den entschlüsselten Code an die Zend Engine weiterreichen.[/quote]
Und was passiert, wenn man sich PHP selbst baut und den dort ankommenden Code dumpen lässt? Kann es sein, dass man dann den Klartext hat?

Alles in allem finde ich so eine obfuscation ziemlich überflüssig, da sie was kostet und keinen Vorteil bringt. Zur Sicherung von Code gibt es Urheberrecht, was auch den vorteil hat dass die Kunden den Code sehen und Patches einschicken können, wenn sie wollen.
tameritoke hat geschrieben:- Ich mache sehr oft in der UML meine Klassendiagramme. Gibt es ein
tool, der basierend auf der XMI Datei Roundtripp Engineering macht und
mir die Klassen mit ihren Beziehungen erstellt?
Igitt, UML! In Python hat man in der Regel keine so tiefen Klassenstrukturen, dass man das bräuchte außerdem ist es sowieso sinnlos weil UML für statische Sprachen geschaffen ist und Python keine solche ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Wie funktioniert der Schutz bei PHP? Ist in der speziell gebauten Ausführungsumgebung ein geheimer Schlüssel verborgen, mit dem dann verschlüsselte in Bytecode kompilierte Dateien vor aus Ausführen wieder entschlüsselt werden?

Das Szenario ist doch wohl, dass man jemandem ein Programm überlassen will, jedoch verhindern möchte, dass er den Programmcode einsehen kann. Dieser jemand hat aber auch die Ausführungsumgebung und alle Zeit der Welt, hier den Schlüssel zu extrahieren. Kein großer Schutz.

Man müsste übrigens noch sicherstellen, dass die Ausführungsumgebung ausschließlich den eigenen verschlüsselten Code ausführen kann, damit nicht anderer Code das Programm zur Laufzeit analysieren kann.

Das läuft dann auf den eigenen privaten PHP-Server hinaus, da hätte man dann die Software auch gleich anders hosten können. Eine Möglichkeit wäre eine "appliance", also eine Kombination aus Hardware und Software als Komplettlösung mit klar definierter kleiner Schnittstelle. Spezielle Hardware (Stichwort Trusted Computing Platform) zusammen mit einer verschlüsselten Festplatte und starker Kryptographie überall kann helfen - dann muss aber das arme PHP oder Python-Script nicht mehr verschlüssel sein. Wir reden hier von einer Lösung a la XBox 360 oder PS3.

Heerscharen von Entwicklern von Intertrust und ContentGuard haben sich Mitte der 90er über diese DRM-Themen Gedanken gemacht. Ich hatte das fragwürdige Vergnügen, Dutzende dieser Patente lesen zu dürfen. Meist geht man davon aus, dass man die Ausführungsumgebung unter Kontrolle hat. Da das IMHO hier nicht gegeben ist, würde ich diese Verfahren alle nicht als sicher einstufen.

Am besten ist, man gibt den Quelltext gar nicht erst raus - dann muss man auch nicht verschlüsseln. Nachteil: Man wird vom Software-Entwickler zum Service-Anbieter. Also sucht man sich einen vertrauenswürdigen Service-Anbieter als Partner.

Vertrauen, ergänzt durch die richtige Menge an Drohung und Unsicherheit ist wohl das beste Konzept, die eigene Software zu schützen, welches einigermaßen funktioniert. Das, und die Erkenntnis, dass in den seltensten Fällen, die eigenen Ergüsse wirklich neu und schützenswert sind ;)

Stefan
tameritoke
User
Beiträge: 2
Registriert: Sonntag 24. Februar 2008, 06:11
Wohnort: Heidesheim am Rhein

Hi sma und Leonidas,
Ihr habt mir beide einen ordentlichen Denkanstoss gegeben.
Und was passiert, wenn man sich PHP selbst baut und den dort ankommenden Code dumpen lässt? Kann es sein, dass man dann den Klartext hat?
MÜSSTE der Quelltext egal bei einer "obfuscation" oder beim laden des Bytecodes der Quelltext an den Interpreter in Klartext ausgehändigt werden?

Also Bytecode oder Verschlüsselung, wo ist denn der Schutz, wenn der Code gedumpt werden kann, sprich anstelle der Standardausgabe in eine Datei meiner Wahl reingeschrieben werden kann?

Und dass ginge zwar dann nicht nur für PHP sondern auch für Python. Oder Irre ich mich?

Das ist die große Quizfrage.

Für jeden Kommentar wäre ich Dankbar.


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

tameritoke hat geschrieben:MÜSSTE der Quelltext egal bei einer "obfuscation" oder beim laden des Bytecodes der Quelltext an den Interpreter in Klartext ausgehändigt werden?
Es gibt keine VM die verschlüsselten Quelltext ausführen kann, denn das ist ja der Sinn der Verschlüsselung, dass die Ausgabe ohne den Schlüssel unsinnig ist.
tameritoke hat geschrieben:Also Bytecode oder Verschlüsselung, wo ist denn der Schutz, wenn der Code gedumpt werden kann, sprich anstelle der Standardausgabe in eine Datei meiner Wahl reingeschrieben werden kann?
Naja, so wie RAM-Defragmentierer eben. Zend Guard produziert wohl Bytecode, aber auch Bytecode kann man zu irgendeiner Art von PHP zurückverwandeln. Sprich, PHP ist da genausoweit wie Python.
tameritoke hat geschrieben:Und dass ginge zwar dann nicht nur für PHP sondern auch für Python. Oder Irre ich mich?
Natürlich. Für PHP habe ich diesen deZender gefunden, für Python gibts decompyle.

Ich schließe mich sma an, was das beste Konzept zum Schutz von Software ist. Hätte es auch nicht besser formulieren können.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

tameritoke, es wird nicht direkt der Quelltext ausgeführt, sondern sowohl bei PHP als auch bei Python ist es virtueller Maschinencode für eine virtuelle Maschine (sog. Bytecode), der zuvor aus dem Quelltext durch Kompilation erzeugt wurde.

Da werde Python noch (so tippe ich mal) PHP darauf ausgelegt wurden, verschlüsselten virtuellen Maschinencode auszuführen, muss dieser wieder entschlüsselt werden, bevor er der virtuellen Maschine vorgelegt wird. Da außerdem die virtuelle Maschine und ihr Maschinencode speziell auf die Anforderungen der jeweiligen Programmiersprache zugeschnitten wurden (im Gegensatz zu einem "echten" Microprozessor, dessen Befehlssatz meist historisch gewachsen ist) kann man mit etwas Übung auch im virtuellen Maschinencode noch das ursprüngliche Programm erkennen.

Obfuscation versucht, dieses durch das Umstellen der Befehle schwerer zu machen, doch der Freiheitsgrad ist da meist sehr gering, sodass dies nicht viel bringt. Auch bei größeren Java-Programmen hatte ich beispielsweise selten größere Schwierigkeiten.

Bei Python kommt man zur Laufzeit definitiv immer an den Bytecode heran, denn jedes Funktionsobjekt hat ein Attribut "func_code", in dem ein Code-Objekt steckt, das wiederum ein Attribut "co_code" hat, und da steckt der Maschinencode in Form eines Byte-Strings drin. Der Python-Interpreter ist weiterhin darauf ausgelegt, dass dieser String im Klartext vorliegen muss.

Es wäre möglich, das im Quelltext des CPython-Interpreters zu ändern. Auch wäre es denkbar, einfach die Codes der Befehle durchzutauschen, sich so quasi seinen eigenen Python-Dialekt zu bauen. Dann müsste man dort aber auch alles abschalten, was selbst Code erzeugt, denn andernfalls könnte man ja experimentell herausfinden, welche Befehle welchen Zahlencode haben. Ich glaube, bei PHP sind die Möglichkeiten da nicht so groß, aber das sehe ich eher als einen Nachteil von PHP als einen Vorteil ;)

Selbst wenn man seinen eigenen CPython-Interpreter gebaut hätte, wo Code-Objekte kein "co_code"-Attribut mehr haben und welcher unbekannte Bytecodes benutzt - jetzt kann ein Angreifer eben versuchen, diesen in C geschriebenen Interpreter zu dekompilieren und mit einem Debugger zu untersuchen. Nicht mehr ganz so einfach, aber nicht unmöglich.

Stefan
BlackJack

Die Interpreterschleife bei Python ist im Grunde ein grosses ``switch``/``case``-Konstrukt, dass die Bytecodes "dispatched". Veränderte Codes lassen sich also an der Stelle im Maschinencode des Interpreters verfolgen. Und diese Stelle im Interpreter selber "unleserlicher" zu machen, halte ich für eine schlechte Idee. Zum einen könnte man den einfachen, schnellen Code damit langsamer machen, und das an einer ganz zentralen Stelle. Zum anderen besteht natürlich die Gefahr, dass man Fehler einbaut, ebenfalls an einer ganz zentralen Stelle.

@tameritoke: Bei "Schutz" ist es immer wichtig genau zu wissen, wogegen mach sich schützen will, weil es den perfekten Schutz einfach nicht gibt. Also muss man abwägen mit wieviel Aufwand man es potentiellen Angreifern schwerer machen will, und eine Abwägung zwischen Nutzen, Wirksamkeit, und Kosten treffen.

Sehr viele, auch kommerzielle Softwareprojekte, die in Java geschrieben sind, haben kein Problem damit `*.class`-Dateien in JARs aus zu liefern. Wenn Dir diese Stufe von Schutz ausreicht, dann pack `*.pyc`-Dateien in ein ZIP-Archiv.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Die Frage ist, hat man überhaupt wirklich schützenswerten Code erzeugt? Ist das was man da gemacht hat, wirklich so toll?

Aber dennoch: Vielleicht gibt es irgendwo ein Tool, welches alle Kommentare aus den Code löscht und Variablen/Funktionen usw. umbenennt, sodas man im Prinzip sehr viel Aufwand treiben muss, bis man mit dem Sourcecode was anfangen kann.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Letzteres sollte zb mit dem Refactoring von Eclipse gehn
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Der Teil von PyDev ist IMHO nicht OpenSource und kostenlos nutzbar. Außerdem wäre damit einige Handarbeit notwendig...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Das Problem bei automatischem Namen umbenennen ist, dass es in Python Programme kaputt machen kann. Es kommt halt doch ab und zu mal vor, das ein Name als Zeichenkette zusammen gesetzt wird und über `getattr`/`setattr()` zugegriffen wird, und das funktioniert dann nicht mehr, weil der Name des Attributs verändert wurde, aber der Code mit der Zeichenkette mit dem Namen nicht.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Langer Rede kurzer Sinn:
- Du willst es nicht
- Du brauchst es nicht.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

mkallas hat geschrieben:Langer Rede kurzer Sinn:
- Du willst es nicht
- Du brauchst es nicht.
Und die Schwierigkeit beginnt genau dort, wo du dies deinem Arbeitgeber klar machen musst ;-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Zum Thema UML: Also iirc kann man mit "dia" Quellcode erzeugen, auch für Python!
Antworten