Robert Bienert: C++ als CGI - Anfänge und Sicherheitsaspekte

Beitrag lesen

Moin!

Danach habe ich die Datei index.cgi mit folgendem Befehl erstellt:
g++ -O2 -Wall index.cpp -o index.cgi

Du möchtest zur Vermeidung gröbster Fehler mindestens noch -Wall anschalten. Viele weitere sinnvolle Warning-Flags findest du in der GCC-Manual.

Hehe, schau dir meinen Befehl nochmal gut an... *g*

Oh, wer lesen kann ist klar im Vorteil, da ist wohl was zwischen -O2 und index.cpp untergegangen.

  • Was sollte man generell bei Benutzung von C++-Applikationen als CGI beachten?

Mit C++ machst du im Vergleich zur Verwendung „sicherer Programmiersprachen“ einen im Vergleich zu C kleinen Topf mit Würmern auf, da ein String erst einmal ein Zeichenarray ist, welches mit einem NULL-Byte abgeschlossen wird. Du musst also z.B. prüfen (lassen), ob dies der Fall ist; Abhilfe kann hier die Verwendung von std::string sein. Auch sind Pointer nicht immer einfach zu benutzen, aber dafür gibt es in C++ Referenzen.

Das ist ein guter Ansatz. Ich habe mir auch bereits gedacht, dass es vielleicht sinnvoll sein könnte, das String-Objekt aus Java direkt nachzubauen, um eine solche Klasse dann in C++ verwenden zu können.

Performanter wird es allerdings bestimmt sein, wenn ich mit std::string arbeite.

Nicht nur das. Bei der String-Klasse std::string von C++ handelt es sich um etwas, dass zum Sprachstandard gehört, d.h. du kannst dich darauf verlassen, dass diese Klasse mit sehr großer Wahrscheinlichkeit sicher ist und du weißt, dass es diese Klasse überall (in jeder Implementierung) gibt. Wenn du hingegen das Rad mit einer eigenen Klasse neu erfindest, besteht potenziell die Gefahr von Sicherheitslöchern, gemäß der Daumenformel, dass auf 1000 Zeilencode ein schwerwiegender Fehler programmiert worden ist. Je nach Anforderung an den verwendeten Zeichensatz kann übrigens die Verwendung der Klasse ustring des Gtkmm-Projektes praktisch sein.

In wie fern es CGI-Bibliotheken für C++ gibt weiß ich nicht, aber so etwas erleichert die Arbeit ungemein.

Das wäre doch mal schön, wenn es solche Bibliotheken gibt.

Ich denke schon, dass es so etwas gibt, da ich allerdings bislang nie das Bedürfnis danach hatte, kann ich nur auf eine Suchmaschine deiner Wahl verweisen. Selbst Template-Engines sollte es geben.

Vielleicht lohnt es sich ja, mal einen schönen Feature-Artikel darüber zu schreiben, der alles genau erklärt. Aber so wie es aussieht, nehmen die meisten hier PHP, Python, Java Servlets oder Perl. Was ja auch ziemlich sinnvoll ist.

Es sind alles CGI-Sprachen, wobei PHP erst einmal ein wenig aus dem Rahmen fällt, weil man hier HTML und Programmlogik zusammen notieren kann. Ansonsten ist es quasi gleichgültig, welche Programmiersprache du für CGI-Anwendungen nimmst, das können sogar Shellskripte sein.

Eventuell könnte ich die Server-Anwendungen ja auch weiterhin mit PHP schreiben, wenn ich einen guten Compiler da habe, der mir PHP-Skripte in lauffähigen Maschinencode übersetzt.
Gibt es da ein paar gute Programme?

Ich glaube, dass das vor ein paar Tagen/Wochen hier diskutiert wurde, aber es kann gut sein, dass so etwas ein paar Euronen kostet. Die Wikipedia verwendet wohl einen entsprechenden Ansatz.

Bei Python scheint es da wesentlich bessere Lösungen zu geben, jedenfalls gibt es dafür so einige Compiler - es gibt selbst Python Bytecode, was dem Prinzip von Java doch sehr ähnelt.

Hmm, vielleicht sollte ich mich doch in Python einarbeiten.

Oder gleich Java nehmen?

Auf jeden Fall sollte es eine Sprache sein, mit der ich sowohl die Web-Applikation als auch den Server an sich schreiben kann. Das würde mit PHP zum Beispiel eher ein böses Unterfangen werden, wohingegen mit Python das alles zu schaffen wäre.

Oder gleich Java nehmen!

Sicherheit ist im Zusammenspiel mit C und C++ ein potenziell heikles Thema. Programme wie der flawfinder können dir bei der Suche nach unsicheren Funktionsaufrufen behilflich sein, aber viele Fehler sind sehr gut versteckt. Auch ist es ratsam, den GCC mit etlichen Warning-Flags mehr aufzurufen, womit du einige weitere subtile Dinge entdecken kannst.

Das mit den Warning-Flags sollte selbstverständlich sein, aber der flawfinder scheint ebenfalls ein echter Tipp zu sein.

Wenn du ganz paranoid/qualitätsorientiert alle Warningflags einschalten möchtest, dann schau in der GCC-Manual sehr weit am Anfang nach, dort sind alle aufgelistet und dann schreib sie per Copy&Paste in dein Makefile.

Was die Freigabe des Quellcodes anbetrifft: Sollte in deinem Programm ein veritabler Bock sein, dürfte das Fehlen von Kommentaren dieses kaum verschleiern. Obwohl das Veröffentlichen des Quellcodes an sich die Gefahr birgt, dass jemand eine Lücke findet, die er ausnutzen kann, dienen solche so genannten Code-Audits dazu, die Öffentlichkeit zu ermuntern, Fehler zu finden, die man selbst nie entdeckt hätte. Wie Opensource an sich halte ich Audits für sehr sinnvoll und fruchtbar.

Das Projekt, dass ich vorhabe, ist noch nicht als OpenSource geplant.

Das muss es auch gar nicht. Es gibt Programmierspezialisten, die von Firmen für Audits ihres Closed Source angeheuert werden. Code Audit heißt in erster Linie, dass externe (das könnte auch eine andere Abteilung sein) Programmierer deinen Code auf mögliche Schwachstellen überprüfen.

Ich bin mir sicher, dass ich den Quelltext (bei Erfolg) irgendwann freigeben werde.

Auch ein interessanter Ansatz. Du kannst natürlich auch den Quelltext freigeben, damit es ein Erfolg wird.

Bis dahin birgt es aber die Gefahr, dass sich jemand anderes den Quelltext schnappt, und einfach ein eigenes Projekt auf die Beine setzt.

Das ist nicht ganz schlüssig: Wenn du jetzt den rohen Code veröffentlichst, dann kann ein Konkurrent höchstens die Idee und ein paar Implementierungsdetails aufschnappen, muss allerdings genauso wie du, noch einen Großteil der Arbeit selbst erledigen. Wenn deine Software hingegen erfolgreich funktioniert und du dann den Code veröffentlichst, kann er die komplette Software nehmen.

Dazu braucht er nur ein wenig Startkapital und eine gute Marketing-Abteilung - den Quelltext hat er dann nämlich schon.

Dazu brauchst du nur die geeignete Lizenz und eine gute Rechtsabteilung.

Sehr schön. Ich liebe dieses Forum, da gibt's so viele Leute, die sich einfach gut mit den Sachen auskennen, die ich erst lernen möchte... :D

Das ist doch ein Geben und ein Nehmen.

Viele Grüße,
Robert