Marc Reichelt: C++ als CGI - Anfänge und Sicherheitsaspekte

Hallo an alle,

da ich für ein zukünftiges Projekt eine ziemlich performante Webapplikation benötige, möchte ich diese nicht mit PHP und MySQL aufbauen, sondern mit kompilierten C++-Programmen.

Da ich mir sicher bin, dass es vielleicht noch andere da draußen geben könnte, die das interessiert, gehe ich jetzt mal ganz detailliert darauf ein.

Um mich mal in die Welt der CGI-Programmierung einzuarbeiten, habe ich auf meinem Server ein Verzeichnis "cgi-test" erstellt und darin folgende .htaccess-Datei abgelegt:

AddHandler cgi-script .cgi
DirectoryIndex index.cgi
Options +ExecCGI

Nun habe ich folgenden Quellcode in die Datei index.cpp geschrieben:

  
#include <iostream>  
#include <cstdlib>  
using namespace std;  
  
// meine erste Webseite, die von einem C++-Programm generiert wird!  
  
int main() {  
  // Header-Informationen  
  cout << "Content-Type: text/html; charset=utf-8\r\n";  
  cout << "\r\n";  
  
  // HTML-Teil  
  cout << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";  
  cout << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";  
  cout << "<html>\n";  
  cout << " <head>\n";  
  cout << "  <title>Test</title>\n";  
  cout << " </head>\n";  
  cout << " <body>\n";  
  cout << "  <p>Willkommen zu meinen ersten SELF-C++-Versuchen. ;)</p>\n";  
  cout << "  <p>Harharhar, jetzt kommt der C++-Code:</p>\n";  
  
  // tralala, das hier ist eine Schleife...  
  cout << "  <p>";  
  for (int i = 1; i <= 100; i++) {  
    cout << i;  
    if (i < 100) {  
      cout << ", ";  
    }  
  }  
  cout << "</p>\n";  
  
  /*  
  // Umgebungsvariablen ausgeben  
  char *data = getenv("QUERY_STRING");  
  cout << "  <p>" << data << "</p>\n";  
  */  
  
  cout << " </body>\n";  
  cout << "</html>\n";  
}

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

Nun habe ich ein paar Fragen an euch:

  • Was sollte man generell bei Benutzung von C++-Applikationen als CGI beachten?
  • Wie sieht das mit den Benutzerrechten aus? Kann das Programm unter anderen Benutzernamen und anderen Gruppen gestartet werden?
  • Und wie ist das mit der Sicherheit? Ist schon allein durch die Freigabe des kommentierten Quellcodes in meinem Beispiel (zwischen /* und */) ein Sicherheitsloch geöffnet?
  • Gibt es gute Literaturquellen, die ihr mir bezüglich C++ als CGI empfehlen könnt?

Grüße

Marc Reichelt || http://www.marcreichelt.de/

--
Linux is like a wigwam - no windows, no gates and an Apache inside!
Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
http://emmanuel.dammerer.at/selfcode.html
  1. Über CGI kann ich Dir nicht all zu viel nützliches sagen, zu C++ schon.

    C++ wird nicht interpretiert, sondern ein zum betreffenden Server-Betriebssystem passender Compiler erzeugt aus dem Quelltext ein auf dem Server lauffähiges Programm. Du legst nicht den Quelltext Deines C++ - Programmes auf dem Server ab, sondern die ausführbare Datei, die der Compiler erzeugt hat.

    Aus Deiner Frage entnehme ich allerdings, daß Du kein C++ - Experte bist.

    Ich würde Dir daher eine andere Vorgehensweise empfehlen:

    Schreibe erst mal Deine Anwendung in einer der klassischen interpretierten Sprachen - z.B. Pearl - für CGI-Skripte. Wenn sich dann herausstellt, daß das Programm zu langsam ist, stelle fest, welche Teile zu langsam sind und überlege, wie Du sie optimieren kannst.

    Est wenn das nicht mehr weiterhilft, versuche die betreffenden Funktionen als externe Maschinencode-Module zu implementieren und an Dein Sktipt anzubinden.

    Zum Schluß noch eine kleine Warnung: C++ bietet sehr viele Möglichkeiten und damit auch sehr viele Möglichkeiten, Fehler zu machen. Wenn Du noch keine Erfahrung damit hast, kannst Du Dich böse verrennen.

    1. Hallo Houyhnhnm,

      C++ wird nicht interpretiert, sondern ein zum betreffenden Server-Betriebssystem passender Compiler erzeugt aus dem Quelltext ein auf dem Server lauffähiges Programm. Du legst nicht den Quelltext Deines C++ - Programmes auf dem Server ab, sondern die ausführbare Datei, die der Compiler erzeugt hat.

      Aus Deiner Frage entnehme ich allerdings, daß Du kein C++ - Experte bist.

      Das bin ich nicht.
      Aber den Unterschied zwischen ausführbaren Programmen und Quelltexten kenne ich sehr wohl - den Quelltext habe ich nur wegen diesem Thread online gestellt.

      Ich würde Dir daher eine andere Vorgehensweise empfehlen:

      Schreibe erst mal Deine Anwendung in einer der klassischen interpretierten Sprachen - z.B. Pearl - für CGI-Skripte. Wenn sich dann herausstellt, daß das Programm zu langsam ist, stelle fest, welche Teile zu langsam sind und überlege, wie Du sie optimieren kannst.

      Ich habe Perl bereits verwendet und nicht gemocht, deshalb habe ich bis jetzt PHP eingesetzt. Da ich das neue Projekt aber gleich richtig angehen will, soll es von Grund auf in C++ geschrieben sein.
      Ich weiß auch, dass die erste Version eines Programms noch nicht perfekt ist. Wie Eric S. Raymond bin auch ich der Meinung, dass man stets ein Programm für den Papierkorb planen sollte (s. Die Kathedrale und der Basar - Post muß immer ankommen), denn auf die eine oder andere Art macht man das sowieso.

      Est wenn das nicht mehr weiterhilft, versuche die betreffenden Funktionen als externe Maschinencode-Module zu implementieren und an Dein Sktipt anzubinden.

      Zum Schluß noch eine kleine Warnung: C++ bietet sehr viele Möglichkeiten und damit auch sehr viele Möglichkeiten, Fehler zu machen. Wenn Du noch keine Erfahrung damit hast, kannst Du Dich böse verrennen.

      Ich habe bereits einiges bezüglich C und C++ gelesen und weiß daher, wovon du sprichst. Ich hätte ja auch Java wählen können, aber diesmal möchte ich wirklich auf Maschinenebene arbeiten.

      Grüße

      Marc Reichelt || http://www.marcreichelt.de/

      --
      Linux is like a wigwam - no windows, no gates and an Apache inside!
      Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
      http://emmanuel.dammerer.at/selfcode.html
      1. Daß Pearl nicht gerade ein Genuß ist, da hast Du recht. Hast Du Dir schonmal Python angesehen?

        Das ist eine sehr schöne objektorientierte Sprache, in die man leicht C/C++ - Funktionen einbinden kann.

        Du hättest dann den Vorteil, die leichter zu handhabenden Python-Konstrukte dort zu verwenden, wo sie schnell genug sind und nur für spezielle rechenintensive Aufgaben auf Maschinenprogramme auszuweichen - die kannst Du von Python aus nach demselben Muster, wie eine Pythonfunktion aufrufen.

        Das hat nebenbei auch noch den Vorteil, daß die C++ - Funktionen sehr gut definierte Schnittstellen bekommen und daher viel leichter zu Testen sind. Wenn Du ein funktionierendes Python-Äquivalent hast, kannst Du sogar testweise beide Varianten aufrufen und die Resultate automatisch vergleichen.

        1. Hallo Houyhnhnm,

          Daß Pearl nicht gerade ein Genuß ist, da hast Du recht. Hast Du Dir schonmal Python angesehen?

          Aahrg, es heißt Perl! Sorry :-)

          Der Ansatz mit Python ist sicher ganz praktisch, aber ich glaube nicht, dass es Marc weiterhilft, wenn er statt einer zwei neue Sprachen erlernen muss.

          Schöne Grüße,

          Johannes

          --
          ie:% fl:( br:< va:| ls:[ fo:) rl:) n4:? ss:| de:] js:| ch:} sh:) mo:| zu:)
          1. Hallo Johannes,

            Aahrg, es heißt Perl! Sorry :-)

            Das wollte ich auch vorhin schreiben, habe es dann aber doch unterlassen... ;)

            Der Ansatz mit Python ist sicher ganz praktisch, aber ich glaube nicht, dass es Marc weiterhilft, wenn er statt einer zwei neue Sprachen erlernen muss.

            Nun denn, Python wäre sicher auch eine schöne Sache. Vor allem wäre das glaube ich wesentlich leichter, als den gesamten Klotz mit C++ zu realisieren.
            Aber Python ist wieder ein ähnliches Prinzip wie PHP: Das Skript wird zur Laufzeit gelesen, geparsed und ausgeführt. (Klar, wie bei PHP gibt es hier wahrscheinlich auch wieder Programme, die ausführbare Dateien erstellen)
            Allerdings sollte man auch nicht vergessen, dass es zugleich eine ganz neue Erfahrung sein kann, ein Web-Projekt komplett mit C++ zu gestalten.

            Grüße

            Marc Reichelt || http://www.marcreichelt.de/

            --
            Linux is like a wigwam - no windows, no gates and an Apache inside!
            Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
            http://emmanuel.dammerer.at/selfcode.html
  2. Hallo,

    was spricht aus Deiner Sicht eigentlich gegen J2EE?

    Ciao

    1. Hallo schneemann,

      was spricht aus Deiner Sicht eigentlich gegen J2EE?

      Ich habe Java selbst in der Uni verwendet, und ich mag es sogar relativ gerne.
      Allerdings habe ich mich bezüglich meinem geplanten Projekt dann doch entschieden, wirklich binären _Maschinencode_ von C++ zu verwenden. Das hat den angenehmen Nebeneffekt, dass ich sehr viel diesbezüglich lernen kann.

      Wieso eigentlich musste ich mich bis jetzt fast nur dazu äußern, warum ich unbedingt C++ als Sprache nehmen will? Bei diesem Forum beklagt sich doch auch niemand, obwohl es in C geschrieben ist... :-/

      Grüße

      Marc Reichelt || http://www.marcreichelt.de/

      --
      Linux is like a wigwam - no windows, no gates and an Apache inside!
      Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
      http://emmanuel.dammerer.at/selfcode.html
      1. Hallo,

        Allerdings habe ich mich bezüglich meinem geplanten Projekt dann doch entschieden, wirklich binären _Maschinencode_ von C++ zu verwenden. Das hat den angenehmen Nebeneffekt, dass ich sehr viel diesbezüglich lernen kann.

        Hast Du mal Geschwindigkeitsvergleiche gelesen, oder geht es wirklich nur um den Erfahrungszuwachs?

        Wieso eigentlich musste ich mich bis jetzt fast nur dazu äußern, warum ich unbedingt C++ als Sprache nehmen will? Bei diesem Forum beklagt sich doch auch niemand, obwohl es in C geschrieben ist... :-/

        Na Du weisst doch wie das hier ist. Du kannst doch nicht ernsthaft erwarten vor Deinem Post eine (unpopuläre) Entscheidung zu treffen, diese nicht vernünftig zu begründen und dann ohne Nachfragen eine Antwort zu bekommen ;)
        Vielleicht kannst Du ja kurz darstellen, um was sich Dein Projekt dreht. Dann ist vielleicht auch die C++ Entscheidung nachvollziehbarer.

        Ciao

        1. Hallo schneemann,

          Allerdings habe ich mich bezüglich meinem geplanten Projekt dann doch entschieden, wirklich binären _Maschinencode_ von C++ zu verwenden. Das hat den angenehmen Nebeneffekt, dass ich sehr viel diesbezüglich lernen kann.
          Hast Du mal Geschwindigkeitsvergleiche gelesen, oder geht es wirklich nur um den Erfahrungszuwachs?

          Von der Geschwindigkeit ist C++ schneller (da reiner Maschinencode). Ob das jetzt nur einige Prozent beträgt, ist eigentlich nicht so wichtig. Da geht es mir wirklich mehr um den Erfahrungszuwachs.

          Wieso eigentlich musste ich mich bis jetzt fast nur dazu äußern, warum ich unbedingt C++ als Sprache nehmen will? Bei diesem Forum beklagt sich doch auch niemand, obwohl es in C geschrieben ist... :-/
          Na Du weisst doch wie das hier ist. Du kannst doch nicht ernsthaft erwarten vor Deinem Post eine (unpopuläre) Entscheidung zu treffen, diese nicht vernünftig zu begründen und dann ohne Nachfragen eine Antwort zu bekommen ;)
          Vielleicht kannst Du ja kurz darstellen, um was sich Dein Projekt dreht. Dann ist vielleicht auch die C++ Entscheidung nachvollziehbarer.

          Hmm, ich möchte das Projekt ungerne so öffentlich zur Schau stellen (ich habe sowieso schon einigen Leuten jede Menge verraten).
          Vielleicht sage ich es mal so rum: Wenn das Projekt in eine Phase kommt (die ich natürlich anpeile), wo zu Lastzeiten in jeder Minute 1000 oder mehr Zugriffe auf den zentralen Server stattfinden, und dieser dann die Verwaltungsarbeit erledigt, um weitere Server in einem internen Netz anzusteuern, die dann selbst wieder bestimmte Aufgaben erledigen - da würde ich schon gerne C++ verwenden.

          Ich wusste schon (zumal ich hier ja seit 2002 aktiv bin), dass ich meine Entscheidung zu C++ garantiert begründen muss.
          Aber dass bis jetzt doch so wenig Leute auf meine ursprünglichen Fragen eingegangen sind, hat mich dann doch überrascht... ;)

          C++ scheint nicht sonderlich begehrt unter den CGI-Sprachen zu sein, zumal es PHP, Perl, Python usw. gibt.

          Grüße

          Marc Reichelt || http://www.marcreichelt.de/

          --
          Linux is like a wigwam - no windows, no gates and an Apache inside!
          Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
          http://emmanuel.dammerer.at/selfcode.html
          1. Hallo,

            Von der Geschwindigkeit ist C++ schneller (da reiner Maschinencode).

            So weit ich weiss kann man das eben so pauschal nicht sagen. Jedenfalls im Vergleich zum Bytecode von Java. Und da hätte man ja bei einer J2EE-Applikation den Vorteil, dass man die Last recht leicht verteilen könnte, da dafür schon Mechanismen vorgesehen sind, die Du bei Deiner CGI-Lösung erst implementieren müßtest.

            Ob das jetzt nur einige Prozent beträgt, ist eigentlich nicht so wichtig. Da geht es mir wirklich mehr um den Erfahrungszuwachs.

            Das halte ich persönlich für das stärkere Argument ;)

            Vielleicht sage ich es mal so rum: Wenn das Projekt in eine Phase kommt (die ich natürlich anpeile), wo zu Lastzeiten in jeder Minute 1000 oder mehr Zugriffe auf den zentralen Server stattfinden, und dieser dann die Verwaltungsarbeit erledigt, um weitere Server in einem internen Netz anzusteuern, die dann selbst wieder bestimmte Aufgaben erledigen - da würde ich schon gerne C++ verwenden.

            Eine derart verteilte Applikation schreit für mich recht laut nach J2EE. Dazu muss ich vielleicht anmerken, dass meine C++-Erfahrung mehr im Bereich bereits kompilierten Codes anzusiedeln ist ;)

            Ich wusste schon (zumal ich hier ja seit 2002 aktiv bin), dass ich meine Entscheidung zu C++ garantiert begründen muss.

            Ich weiss, dass Du hier schon länger aktiv bist. Deshalb hat mich Deine Frage ohne Schilderung der Gesamtsituation auch so überrascht.

            Ciao

          2. Hallo Marc,

            Von der Geschwindigkeit ist C++ schneller (da reiner Maschinencode).

            Lustigerweise stimmt das so pauschal nicht. Es gab vor einige Zeit mal in der iX einen Vergleich und bis auf bei wenigen C++-Compilern schnitt Java um einiges besser, als C++ ab. (ging nicht um Webentwicklung sondern allgemein und C hat Java natürlich geschlagen, C++ aber eben nicht unbedingt) C++ hat halt den Vorteil, dass Du vergleichsweise geringen Overhead hast, wenn Du das Programm startest, während bei Java die komplette JVM geladen werden muss. Daher ist Java als CGI absoluter Bullshit. ;-) Wenn die JVM aber eh läuft (Servlets o.ä.), dann kann Java-Code durchaus schneller sein, als C++-Code, außer, Du hast einen guten C++-Compiler (und der gcc vor 4.0 gehört definitiv *nicht* dazu, der Test behandelte aber nur gcc bis 3.nochwas, kann Dir also nicht sagen, wie's mit dem 4.0 aussieht). Mit C oder gar Assembler schlägst Du Java dagegen natürlich locker.

            Viele Grüße,
            Christian

            1. Hallo Christian,

              Von der Geschwindigkeit ist C++ schneller (da reiner Maschinencode).

              Lustigerweise stimmt das so pauschal nicht. Es gab vor einige Zeit mal in der iX einen Vergleich und bis auf bei wenigen C++-Compilern schnitt Java um einiges besser, als C++ ab. (ging nicht um Webentwicklung sondern allgemein und C hat Java natürlich geschlagen, C++ aber eben nicht unbedingt)

              Das verwundert mich jetzt natürlich sehr, woran das liegen kann. Schließlich ist ein kompiliertes C++-Programm genauso Maschinencode wie die JVM, wobei die JVM ja noch den binären Java Code ausführen muss.

              Allerdings bin ich doch zu neugierig, weil ich für dieses Projekt unbedingt C++ verwenden will - sei es um der Erfahrung willen. ;)

              Grüße

              Marc Reichelt || http://www.marcreichelt.de/

              --
              Linux is like a wigwam - no windows, no gates and an Apache inside!
              Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
              http://emmanuel.dammerer.at/selfcode.html
              1. Hallo Marc,

                Lustigerweise stimmt das so pauschal nicht. Es gab vor einige Zeit mal in der iX einen Vergleich und bis auf bei wenigen C++-Compilern schnitt Java um einiges besser, als C++ ab. (ging nicht um Webentwicklung sondern allgemein und C hat Java natürlich geschlagen, C++ aber eben nicht unbedingt)

                Das verwundert mich jetzt natürlich sehr, woran das liegen kann.

                Schleche Compiler. ;-) Außerdem musst Du bedenken, dass C++ mehr OOP-Features bietet, als Java (Mehrfachvererbung, Überladen von Operatoren, Templates [1]), die natürlich auch alle Overhead produzieren.

                Viele Grüße,
                Christian

                [1] Oder gibt's sowas doch in Java?

                1. Hallo,

                  Templates [1]
                  [1] Oder gibt's sowas doch in Java?

                  Sind Templates in C++ nicht so was ähnliches wie die Generics, die mit Java 1.5 hinzugekommen sind?

                  Ciao

                  1. Hallo,

                    Templates [1]
                    [1] Oder gibt's sowas doch in Java?
                    Sind Templates in C++ nicht so was ähnliches wie die Generics, die mit Java 1.5 hinzugekommen sind?

                    Keine Ahnung, was Generics sind. Mit Templates kannst Du eine generische Klasse für z.B. eine Liste oder einen Stack oder so definieren, wo der Datentyp der Einzelelemente noch nicht von vorne herein festgelegt ist, sondern rest bei der Deklaration verwendet wird. Du kannst dann z.B.

                    MyStack<int> stack = new MyStack<int>();

                    machen. Ich weiß nicht, wie ich das jetzt gut erklären soll, ich lass das einfach mal so stehen, ich hoffe, Du kommst mit der Erklärung klar. :/

                    Viele Grüße,
                    Christian

                    1. Hallo,

                      ja, das scheint recht ähnlich zu sein.

                      Ciao

                  2. Hallo schneemann,

                    Sind Templates in C++ nicht so was ähnliches wie die Generics, die mit Java 1.5 hinzugekommen sind?

                    Die Idee ist die gleiche ja. Allerdings hat Java ein paar Einschränkungen (in C++ gehen meines Wissens so Dinge wie class Blub<T> extends T also ein Parametrisieren der Elternklasse) und auch Features, die C++ nicht hat (z.B. Wildcard-Typen wie List<? extends Blub>).

                    Außerdem sind Java-Generics ganz anders implementiert. Bei C++ wird für jede "Instanz" eines Templates eine entsprechende Klasse erzeugt, bei Java nicht. Die Typen werden nur zur Kompilezeit geprüft und anschliesen werden entsprechend Casts eingefügt. Die Information über Typ-Parameter ist im Bytecode nicht mehr enthalten.

                    Grüße

                    Daniel

                    1. Hallo Daniel,

                      class Blub<T> extends T

                      Ich stelle fest, dass C++ in dieser Hinsicht eine kranke Sprache ist. ;-)

                      Viele Grüße,
                      Christian

              2. Hallo Marc,

                Das verwundert mich jetzt natürlich sehr, woran das liegen kann. Schließlich ist ein kompiliertes C++-Programm genauso Maschinencode wie die JVM, wobei die JVM ja noch den binären Java Code ausführen muss.

                Der wird ja auch (zumindest zum Teil) kompiliert, vermutlich ist der JIT-Compiler von Java einfach ziemlich gut. Außerdem hat er natürlich die Möglichkeit, das Laufzeitverhalten mit zu analysieren um den Code besser zu optimieren. Ich weiß allerdings nicht, in wie weit das tatsächlich gemacht wird.

                Grüße

                Daniel

  3. Hi Marc,

    Da ich mir sicher bin, dass es vielleicht noch andere da draußen geben könnte, die das interessiert, gehe ich jetzt mal ganz detailliert darauf ein.

    Ja, ich bin zur Zeit auch sehr daran interessiert, und genau wie du vor allem wegen des Lerneffektes, aber auf lange Sicht schlussendlich wegen Geld.

    Ich habe eine Appplikation mit Hilfe von PHP und MySQL erstellt, die aber auf meinem Shered Server wärend Spitzenzeiten ganz schön ins schwitzen kommt. Jetzt werden wir auf einen eigenen Server umziehen, der nur für uns arbeitet. Da hoffe ich dass wir dann bis zum zehnfachen an Anfragen mit der gleichen Software bedienen können (zur Zeit sind es ca. 2 Anfragen pro Sekunde). Aber der Trend geht zu noch viel mehr, so dass ich vor habe das ganze vom Prinzip her wie das CForum aufzubauen, dass die Daten, die andauernd gebraucht werden im Speicher gehalten werden und erst wenn sie nicht mehr benötigt werden (also am ende des Tages) in eine Datenbank zum Archivieren verschoben werden. Dann müsste man zum Beispiel fast überhaupt nicht mehr auf die Festplatten zugreifen und schont den Server ungemein.

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

    Erst einmal auch die gleichen Sachen wie bei anderen Programmiersprachen, dass man keine Sicherheitslöcher reinreist ;-).

    • Wie sieht das mit den Benutzerrechten aus? Kann das Programm unter anderen Benutzernamen und anderen Gruppen gestartet werden?

    Ich würde pauschal sagen, dass du ja Rechte via chmod vergeben kannst

    • Gibt es gute Literaturquellen, die ihr mir bezüglich C++ als CGI empfehlen könnt?

    Hm, also so weit bin ich leider noch gar nicht, ich lese gerade Thinking in C++

    Grüße
    Jeena Paradies

    1. Hallo Jeena,

      Da ich mir sicher bin, dass es vielleicht noch andere da draußen geben könnte, die das interessiert, gehe ich jetzt mal ganz detailliert darauf ein.
      Ja, ich bin zur Zeit auch sehr daran interessiert, und genau wie du vor allem wegen des Lerneffektes, aber auf lange Sicht schlussendlich wegen Geld.

      Stimmt, das steht meistens am Ende der Schlange. Trotzdem hat der Lerneffekt ja zumeist auch den kleinen Vorteil, dass man für weitere Projekte vorsorgt, sogar bereits ohne etwas von den neuen Projekten zu wissen. ;)

      Ich habe eine Appplikation mit Hilfe von PHP und MySQL erstellt, die aber auf meinem Shered Server wärend Spitzenzeiten ganz schön ins schwitzen kommt. Jetzt werden wir auf einen eigenen Server umziehen, der nur für uns arbeitet. Da hoffe ich dass wir dann bis zum zehnfachen an Anfragen mit der gleichen Software bedienen können (zur Zeit sind es ca. 2 Anfragen pro Sekunde).

      Da sieht man, dass MySQL doch für solche Dinge nicht so sehr geeignet ist. Soweit ich weiß kann man auf einem derzeit üblichen Rechner mit einem GB RAM nur 100 MySQL-Anmeldungen in der Minute schaffen - das mag auch ein Gerücht sein, aber die Leistungseinbußen sind enorm, das ist wahr.

      Aber der Trend geht zu noch viel mehr, so dass ich vor habe das ganze vom Prinzip her wie das CForum aufzubauen, dass die Daten, die andauernd gebraucht werden im Speicher gehalten werden und erst wenn sie nicht mehr benötigt werden (also am ende des Tages) in eine Datenbank zum Archivieren verschoben werden. Dann müsste man zum Beispiel fast überhaupt nicht mehr auf die Festplatten zugreifen und schont den Server ungemein.

      Das mit dem "Im Speicher halten" ist eine sehr gute Idee, das werde ich bei meinem Projekt wahrscheinlich ebenfalls so machen. Allerdings werde ich da langfristig ziemlich viel Speicher brauchen...

      • Was sollte man generell bei Benutzung von C++-Applikationen als CGI beachten?
        Erst einmal auch die gleichen Sachen wie bei anderen Programmiersprachen, dass man keine Sicherheitslöcher reinreist ;-).

      Wobei das in C++ vermutlich eine harte Aufgabe sein werden kann.
      Ich werde jedenfalls vorher eine Menge in C++ programmieren, damit ich für das Projekt entsprechend gewappnet bin, und genau weiß, wo die Fehler zumeist liegen.

      • Wie sieht das mit den Benutzerrechten aus? Kann das Programm unter anderen Benutzernamen und anderen Gruppen gestartet werden?
        Ich würde pauschal sagen, dass du ja Rechte via chmod vergeben kannst

      Die Rechte, Benutzer und Gruppe für die Datei sind klar, ich beziehe mich hier aber auf den Benutzer und die Gruppe, mit der das Programm dann vom Apache aus gestartet wird.

      Wahrscheinlich heißt die Technik hier - wie bei PHP - suexec.

      • Gibt es gute Literaturquellen, die ihr mir bezüglich C++ als CGI empfehlen könnt?
        Hm, also so weit bin ich leider noch gar nicht, ich lese gerade Thinking in C++

      Hmm, das scheint mir ein gutes Buch zu sein. Vor allem kann man es direkt online lesen, auch ein Bonus. Werde ich mir zum Lesen vormerken.
      Derzeit lese ich noch C++ - Objektorientiertes Programmieren von Anfang an (die Original-Seite des Verlages zu diesem Buch ist im Firefox ziemlich unbrauchbar). Das ist ziemlich gut.
      Außerdem habe ich noch von vor ein paar Jahren ein Buch übrig, nämlich das C/C++ Kompendium.

      Gibt es eventuell noch gute Online-Quellen zu APIs? Beispielsweise etwas Ähnliches wie die JavaDocs für Java?

      Grüße

      Marc Reichelt || http://www.marcreichelt.de/

      --
      Linux is like a wigwam - no windows, no gates and an Apache inside!
      Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
      http://emmanuel.dammerer.at/selfcode.html
    2. Hallo Jeena,

      Ich habe eine Appplikation mit Hilfe von PHP und MySQL erstellt, die aber auf meinem Shered Server wärend Spitzenzeiten ganz schön ins schwitzen kommt. Jetzt werden wir auf einen eigenen Server umziehen, der nur für uns arbeitet. Da hoffe ich dass wir dann bis zum zehnfachen an Anfragen mit der gleichen Software bedienen können (zur Zeit sind es ca. 2 Anfragen pro Sekunde). Aber der Trend geht zu noch viel mehr, so dass ich vor habe das ganze vom Prinzip her wie das CForum aufzubauen, dass die Daten, die andauernd gebraucht werden im Speicher gehalten werden und erst wenn sie nicht mehr benötigt werden (also am ende des Tages) in eine Datenbank zum Archivieren verschoben werden. Dann müsste man zum Beispiel fast überhaupt nicht mehr auf die Festplatten zugreifen und schont den Server ungemein.

      Wenn es um eine kommerzielle Sache geht: Hardware ist immer noch die günstigste Optimierung; natürlich nicht günstig für dich ;-)
      Wäre Christian für die Entwicklung des Cforums zum üblichen Stundenlohn bezahlt worden, wären ein paar neue Server mit Sicherheit wesentlich günstiger gewesen.

      Schöne Grüße,

      Johannes

      --
      ie:% fl:( br:< va:| ls:[ fo:) rl:) n4:? ss:| de:] js:| ch:} sh:) mo:| zu:)
      1. Hallo,

        Wenn es um eine kommerzielle Sache geht: Hardware ist immer noch die günstigste Optimierung; natürlich nicht günstig für dich ;-)

        pssst nicht so laut ;-)

        Wäre Christian für die Entwicklung des Cforums zum üblichen Stundenlohn bezahlt worden, wären ein paar neue Server mit Sicherheit wesentlich günstiger gewesen.

        Jo bei mir ist das so ne halb halb sache, die Software muss sowieso weiterentwickelt werden und es kommen mehr Featurerequests als ich abarbeiten kann. Und wenn es im angepeilten Tempo weitergeht muss man die Software sowieso so umschreiben, dass man mehrere Server mit dem beantworten beauftragen kann, dann kann man ja gleich ein wenig mehr investirern und Die Software richtig machen ;-).

        Grüße
        Jeena Paradies

  4. 你好 Marc,

    • Und wie ist das mit der Sicherheit? Ist schon allein durch die Freigabe
      des kommentierten Quellcodes in meinem Beispiel (zwischen /* und */) ein
      Sicherheitsloch geöffnet?

    Ja, da undefiniertes Verhalten auftreten könnte: getenv() kann NULL
    zurückgeben. Diese Möglichkeit schließt du vor der Ausgabe nicht aus.

    再见,
     克里斯蒂安

    --
    MMORPG-Slang | Kranke Phantasie
    Es gibt keinen Ort, wo der Geist zu finden waere. Er ist wie die Fussspuren der Voegel am Himmel.
    http://wwwtech.de/
    1. Hallo Christian,

      • Und wie ist das mit der Sicherheit? Ist schon allein durch die Freigabe
        des kommentierten Quellcodes in meinem Beispiel (zwischen /* und */) ein
        Sicherheitsloch geöffnet?

      Ja, da undefiniertes Verhalten auftreten könnte: getenv() kann NULL
      zurückgeben. Diese Möglichkeit schließt du vor der Ausgabe nicht aus.

      Ich weiß, dass getenv() NULL zurückgeben kann, da ich mir das vorher in den Beispielen genau angesehen habe. ;)

      Im Code habe ich es dann natürlich nicht mehr vermerkt, da hast du Recht.
      Allerdings ist kein Fehlverhalten aufgetreten, selbst beim Aufruf der Datei ohne gänzliche Parameter.

      Das werde ich natürlich noch ausgiebig testen, bevor ich die Methode weiter verwende.

      Hierzu noch eine Frage: Der Aufruf getenv("QUERY_STRING") liefert mir ja den kompletten Teilstring zurück, der an die URL nach dem Fragezeichen angehängt wird. Wie formatiert man diesen nun am besten um? Und bekommt auch Sonderzeichen wieder so, wie sie übergeben wurden?

      Ich habe mir dazu kurzerhand mal deinen Quelltext vom SELFHTML Forum angeschaut, aber doch nicht viel kapiert.

      Grüße

      Marc Reichelt || http://www.marcreichelt.de/

      --
      Linux is like a wigwam - no windows, no gates and an Apache inside!
      Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
      http://emmanuel.dammerer.at/selfcode.html
      1. Moin!

        Ja, da undefiniertes Verhalten auftreten könnte: getenv() kann NULL zurückgeben. Diese Möglichkeit schließt du vor der Ausgabe nicht aus.

        Ich weiß, dass getenv() NULL zurückgeben kann, da ich mir das vorher in den Beispielen genau angesehen habe. ;)

        Wenn du eine „gescheite Libc“™ verwendest, wird statt eines Murkses einfach der String "(null)" ausgegeben.

        Das werde ich natürlich noch ausgiebig testen, bevor ich die Methode weiter verwende.

        Das ist sehr gut, wenn du möchtest, kannst du uns ja daran teilhaben lassen (knifflige Probleme finden oder merkwürdige Fehler aufklären).

        Hierzu noch eine Frage: Der Aufruf getenv("QUERY_STRING") liefert mir ja den kompletten Teilstring zurück, der an die URL nach dem Fragezeichen angehängt wird. Wie formatiert man diesen nun am besten um? Und bekommt auch Sonderzeichen wieder so, wie sie übergeben wurden?

        Für C++ müsste es fertige CGI-Bibliotheken geben, die z.B. den Querystring bzw. eine POST-Eingabe komplett zerlegen und in einer std::map oder so zur Verfügung stellen. Dabei ist allerdings unabhängig davon, ob du eine bestehende oder eigens entwickelte Bibliothek einsetzt, zu beachten, wie z.B. mit dem Nullbyte umgegangen wird, was als %00 prima per URL daherkommt und dir im Zusammenspiel mit C (z.B. als Dateiname) Probleme bereiten kann.

        Viele Grüße,
        Robert

      2. 你好 Marc,

        Im Code habe ich es dann natürlich nicht mehr vermerkt, da hast du Recht.
        Allerdings ist kein Fehlverhalten aufgetreten, selbst beim Aufruf der
        Datei ohne gänzliche Parameter.

        Das heisst nichts ;) Gerade auf Systemen, wo nicht die GNU-Libs benutzt
        werden (also auf FreeBSD oder Solaris) gibts da gerne schonmal Abstürze,
        wenn du Glück hast.

        Wie formatiert man diesen nun am besten um? Und bekommt auch
        Sonderzeichen wieder so, wie sie übergeben wurden?

        Naja, von Hand. Query-String durchgehen, bei & trennen, bei = trennen, der
        Teil vor dem = ist der Feld-Name, der Teil danach der Wert. Kodierung ist
        %<Hex-Ziffer><Hex-Ziffer>, also ist die Dekodierung auch ziemlich einfach.

        Ich habe mir dazu kurzerhand mal deinen Quelltext vom SELFHTML Forum
        angeschaut, aber doch nicht viel kapiert.

        Najor. Das ist nicht so schwer. Guck dir halt cfcgi.c an.

        再见,
         克里斯蒂安

        --
        MMORPG-Slang | Kranke Phantasie
        Kommt ein Nullvektor zum Psychiater: "Herr Doktor, ich bin orientierungslos!"
        http://wwwtech.de/
        1. Hallo Christian,

          Im Code habe ich es dann natürlich nicht mehr vermerkt, da hast du Recht.
          Allerdings ist kein Fehlverhalten aufgetreten, selbst beim Aufruf der
          Datei ohne gänzliche Parameter.

          Das heisst nichts ;) Gerade auf Systemen, wo nicht die GNU-Libs benutzt
          werden (also auf FreeBSD oder Solaris) gibts da gerne schonmal Abstürze,
          wenn du Glück hast.

          OK. Das sollte mir sagen, dass bei solchen Dingen generell ganz genau aufgepasst werden sollte.

          Wie formatiert man diesen nun am besten um? Und bekommt auch
          Sonderzeichen wieder so, wie sie übergeben wurden?

          Naja, von Hand. Query-String durchgehen, bei & trennen, bei = trennen, der
          Teil vor dem = ist der Feld-Name, der Teil danach der Wert. Kodierung ist
          %<Hex-Ziffer><Hex-Ziffer>, also ist die Dekodierung auch ziemlich einfach.

          Ich habe mir so etwas schon fast gedacht.
          Bei POST sieht das anscheinend etwas anders aus, aber da habe ich eine ganz gute Quelle gefunden.

          Ich habe mir dazu kurzerhand mal deinen Quelltext vom SELFHTML Forum
          angeschaut, aber doch nicht viel kapiert.

          Najor. Das ist nicht so schwer. Guck dir halt cfcgi.c an.

          Werde ich machen. :)

          Allerdings habe ich mittlerweile kapiert, dass das Projekt mit C++ doch sehr aufwendig werden wird. Längerfristig werde ich garantiert mehrere C++-Programme schreiben, allerdings werde ich bis dahin vermutlich PHP nehmen, zusammen mit einer Datenbank, am besten SQL. Das einfach nur deshalb, weil ich mich damit zur Zeit am Besten auskenne, und das Projekt erst mal online gehen sollte. Wenn es dann erfolgreich ist, lohnt sich der Aufwand mit C++ wenigstens.

          Wegen dem RDBMS:
          Ich habe gehört, dass MySQL offenbar einige Performance-Probleme hat. Wäre für mich da ein anderer Server besser geeignet, z. B. PostgreSQL?

          Grüße

          Marc Reichelt || http://www.marcreichelt.de/

          --
          Linux is like a wigwam - no windows, no gates and an Apache inside!
          Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
          http://emmanuel.dammerer.at/selfcode.html
          1. 你好 Marc,

            Bei POST sieht das anscheinend etwas anders aus, aber da habe ich eine
            ganz gute Quelle gefunden.

            Nee. Bei POST sieht das genau so aus. Da liegen die Daten nur als
            Datenstrom an STDIN an. Ausser, du meinst Formulare, die mit
            enctype="multipart/form-data" abgeschickt wurden; da sieht es in der
            Tat anders aus.

            Wegen dem RDBMS:
            Ich habe gehört, dass MySQL offenbar einige Performance-Probleme hat.

            Ich würde sagen, das ist so pauschal Unfug. Es kommt immer darauf an, was
            du genau machst, wie der Server konfiguriert ist, usw.

            Wäre für mich da ein anderer Server besser geeignet, z. B. PostgreSQL?

            Das hängt davon ab, was du machen möchtest.

            再见,
             克里斯蒂安

            --
            MMORPG-Slang | Kranke Phantasie
            Nur die Weisesten und die Dümmsten können sich nicht ändern.
            http://wwwtech.de/
          2. Moin!

            Hallo Christian,

            Im Code habe ich es dann natürlich nicht mehr vermerkt, da hast du Recht.
            Allerdings ist kein Fehlverhalten aufgetreten, selbst beim Aufruf der Datei ohne gänzliche Parameter.

            Das heisst nichts ;) Gerade auf Systemen, wo nicht die GNU-Libs benutzt werden (also auf FreeBSD oder Solaris) gibts da gerne schonmal Abstürze, wenn du Glück hast.

            OK. Das sollte mir sagen, dass bei solchen Dingen generell ganz genau aufgepasst werden sollte.

            Im Umgang mit Pointern, und letztendlich sind C-Strings und C-Arrays nichts Anderes, musst du generell Vorsicht walten lassen, weil ein falscher Gebrauch davon eine der Sicherheitslücken schlechthin ist, Stichwort Buffer Overflow, ungeprüfter Pointerzugriff, Manipulation der Rücksprungadresse.

            Wie formatiert man diesen nun am besten um? Und bekommt auch Sonderzeichen wieder so, wie sie übergeben wurden?

            Naja, von Hand. Query-String durchgehen, bei & trennen, bei = trennen, der Teil vor dem = ist der Feld-Name, der Teil danach der Wert. Kodierung ist %<Hex-Ziffer><Hex-Ziffer>, also ist die Dekodierung auch ziemlich einfach.

            Ich habe mir so etwas schon fast gedacht.
            Bei POST sieht das anscheinend etwas anders aus, aber da habe ich eine ganz gute Quelle gefunden.

            Wie Christian schon angedeutet hat: Der einzige Unterschied zwischen GET und POST ist (unter den normalen Voraussetzungen, also nicht multipart/form-data), dass bei POST der Querystring durch die Standardeingabe (stdin bzw. std::cin) hereinkommt, wobei dessen Länge in der Umgebungsvariable CONTENT_LENGTH steht. Genaueres dazu findest du im Selfhtml-Abschnitt <http://de.selfhtml.org/servercgi/cgi/formularverarbeitung.htm@title=HTML-Formulare und CGI>.

            Wegen dem RDBMS:
            Ich habe gehört, dass MySQL offenbar einige Performance-Probleme hat. Wäre für mich da ein anderer Server besser geeignet, z. B. PostgreSQL?

            Was hast du denn vor? Die Bereiche, in denen PostgreSQL seine Performance-Vorteile gegenüber MySQL ausspielen kann, erreichst du IMHO erst, wenn deine Datenbank-Anwendung wirklich stark beansprucht wird. Dafür bietet PostgreSQL allerdings Features, die es in neueren MySQL-Versionen oder bislang noch gar nicht gibt (referenzielle Integrität, Trigger, Views, Subselects).

            Viele Grüße,
            Robert

  5. Moin!

    da ich für ein zukünftiges Projekt eine ziemlich performante Webapplikation benötige, möchte ich diese nicht mit PHP und MySQL aufbauen, sondern mit kompilierten C++-Programmen.

    Das klingt doch interessant. Ich bin in dieser Hinsicht kein Experte, habe aber schon ein paar Gehversuche hinter mir. Und bei C++ kann ich dir wohl auch weiterhelfen.

    Da ich mir sicher bin, dass es vielleicht noch andere da draußen geben könnte, die das interessiert, gehe ich jetzt mal ganz detailliert darauf ein.

    Das zeigen ja auch schon die Antworten.

    Um mich mal in die Welt der CGI-Programmierung einzuarbeiten, habe ich auf meinem Server ein Verzeichnis "cgi-test" erstellt und darin folgende .htaccess-Datei abgelegt:

    AddHandler cgi-script .cgi
    DirectoryIndex index.cgi
    Options +ExecCGI

    Das scheint ja zu funktionieren, oder stellst du irgendwelche Meldungen in deiner error_log fest?

    Nun habe ich folgenden Quellcode in die Datei index.cpp geschrieben:

    Wir besprechen das mal hier:

    #include <iostream>

    #include <cstdlib>

      
    BTW: Diesen ^^^ Include brauchst du doch nur, wenn du die Ausgabe der Umgebungsvariablen einkommentierst.  
      
    
    > ~~~c++
    
    using namespace std;  
    
    >   
    > int main() {  
    >   // Header-Informationen  
    >   cout << "Content-Type: text/html; charset=utf-8\r\n";  
    >   cout << "\r\n";  
    >   
    >   // HTML-Teil  
    >   cout << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";  
    >   cout << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
    
    

    Es ist performanter, die komplette Ausgabe in einem Rutsch zu erledigen, als dafür sehr oft cout << aufzurufen. C und C++ bieten dir an, so genannte Zeichenkonstanten bis zu einer Länge von 500+etwas über mehrere Zeilen zu notieren:

      
    cout << "Content-Type: text/html; charset=utf-8\r\n"  
            "\r\n"  
            // HTML-Teil  
            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"  
            "…";  
    
    

    Außerdem frage ich mich, weshalb du XHTML 1.0 Strict als text/html mit der XML-Deklaration auslieferst.

    // snip

    cout << " </body>\n";
      cout << "</html>\n";

      
    Fehlt hier nicht etwas, z.B. `return 0;`{:.language-c++}?  
      
    
    > `}`{:.language-c++}  
    >   
    > Danach habe ich die Datei [index.cgi](http://marcreichelt.de/cgi-test/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.  
      
    
    > Nun habe ich ein paar Fragen an euch:  
    >   
    > - 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.  
      
    Im Vergleich zu solch integrierten Lösungen wie ASP, PHP, PerlEmbed, … gibt es bei der Verwendung von C++ keine so hübsche Lösung, den Programmcode in das HTML einzubetten, weshalb dir im Editor der HTML-Code immer nur als Zeichenkette angegeben wird. Du wirst also in deinem Browser die Quelltextansicht häufiger benutzen. In wie fern es CGI-Bibliotheken für C++ gibt weiß ich nicht, aber so etwas erleichert die Arbeit ungemein.  
      
    
    > - Wie sieht das mit den Benutzerrechten aus? Kann das Programm unter anderen Benutzernamen und anderen Gruppen gestartet werden?  
      
    Sofern das Programm das x-Bit gesetzt für die entsprechende Gruppe oder den entsprechenden Benutzer gesetzt hat, lässt es sich ausführen.  
      
    
    > - Und wie ist das mit der Sicherheit? Ist schon allein durch die Freigabe des kommentierten Quellcodes in meinem Beispiel (zwischen /\* und \*/) ein Sicherheitsloch geöffnet?  
      
    Sicherheit ist im Zusammenspiel mit C und C++ ein potenziell heikles Thema. Programme wie der [flawfinder](http://www.dwheeler.com/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.  
      
    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.  
      
    
    > - Gibt es gute Literaturquellen, die ihr mir bezüglich C++ als CGI empfehlen könnt?  
      
    Prinzipieller Natur dürfte, falls dich C++ interessiert, das C++-Buch von Bjarne Stroustrup, dem Erfinder von C++, sein. Ansonsten gibt es im Internet haufenweise gute Dokus zum Thema sicheres Programmieren mit C und/oder CGI, wobei ich hier grad mal ein paar Links auf Lager hab, aber eine gute Suchmaschine und SELF-Kompetenz („die Community“) sollten dir weiter helfen:  
      
     \* [Secure Programming for Unix and Linux HOWTO](http://www.dwheeler.com/secure-programs)  
     \* [Die Datenschleuder – Wer hat Angst vorm bösen Wolf?](http://ds.ccc.de/081/insertion-attacks)  
     \* [The World Wide Web Security FAQ](http://www.w3.org/Security/Faq/www-security-faq.html)  
     \* und ein bisschen Eigenwerbung: [„Sicherheit” mit PHP/CGI, MySQL](http://robertbienert.de/dokumente/web/PHPMySQLSicherheit.html) (wird von mir grad überarbeitet)  
      
    Viele Grüße,  
    Robert
    
    1. Hallo Robert,

      Um mich mal in die Welt der CGI-Programmierung einzuarbeiten, habe ich auf meinem Server ein Verzeichnis "cgi-test" erstellt und darin folgende .htaccess-Datei abgelegt:

      AddHandler cgi-script .cgi
      DirectoryIndex index.cgi
      Options +ExecCGI

      Das scheint ja zu funktionieren, oder stellst du irgendwelche Meldungen in deiner error_log fest?

      Nein, keine Meldungen diesbezüglich. Aber es war gut, mal wieder in die error_log zu schauen - da habe ich soeben festgestellt, dass PHP bei der Initialisierung dauernd einen Fehler ausgibt, da ein Fehler in der php.ini ist (ich hatte für Kommentare das Zeichen "#" verwendet, und nicht das Zeichen ";").
      Nun ist das schon mal behoben. :)

      Nun habe ich folgenden Quellcode in die Datei index.cpp geschrieben:

      Wir besprechen das mal hier:

      #include <iostream>

      #include <cstdlib>

      
      >   
      > BTW: Diesen ^^^ Include brauchst du doch nur, wenn du die Ausgabe der Umgebungsvariablen einkommentierst.  
        
      Jepp, hatte es dort noch vergessen gehabt. Ist jetzt ebenfalls in einem Kommentar (siehe Link auf aktuellen Quelltext).  
        
      
      > > [...code-gewurschtel vom marc...]  
      > Es ist performanter, die komplette Ausgabe in einem Rutsch zu erledigen, als dafür sehr oft `cout <<`{:.language-c++} aufzurufen. C und C++ bieten dir an, so genannte Zeichenkonstanten bis zu einer Länge von 500+etwas über mehrere Zeilen zu notieren:  
      >   
      > ~~~c++
        
      
      > cout << "Content-Type: text/html; charset=utf-8\r\n"  
      >         "\r\n"  
      >         // HTML-Teil  
      >         "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"  
      >         "…";  
      > 
      
      

      Supi! Das ist doch schon mal eine ordentliche Steigerung.

      Außerdem frage ich mich, weshalb du XHTML 1.0 Strict als text/html mit der XML-Deklaration auslieferst.

      // snip

      cout << " </body>\n";
        cout << "</html>\n";

      
      >   
      > Fehlt hier nicht etwas, z.B. `return 0;`{:.language-c++}?  
        
      Doch, das fehlte. Habe ich inzwischen bereits geändert gehabt. ;)  
        
      
      > > Danach habe ich die Datei [index.cgi](http://marcreichelt.de/cgi-test/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\*  
        
      
      > > - 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.  
      Das mit den Referenzen habe ich mir bereits in meinem derzeitigen Buch angeschaut, das ist wirklich eine schöne Sache (und bin ich ja auch von PHP so bzw. ähnlich gewohnt).  
        
      
      > Im Vergleich zu solch integrierten Lösungen wie ASP, PHP, PerlEmbed, … gibt es bei der Verwendung von C++ keine so hübsche Lösung, den Programmcode in das HTML einzubetten, weshalb dir im Editor der HTML-Code immer nur als Zeichenkette angegeben wird. Du wirst also in deinem Browser die Quelltextansicht häufiger benutzen. 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.  
      Mit dem "In den Quelltext schreiben" habe ich mittlerweile keine Probleme mehr, das geht nach ein paar Jahren HTML ziemlich flüssig.  
        
      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.  
        
      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?  
        
      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.  
        
      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.  
        
      
      > > - Und wie ist das mit der Sicherheit? Ist schon allein durch die Freigabe des kommentierten Quellcodes in meinem Beispiel (zwischen /\* und \*/) ein Sicherheitsloch geöffnet?  
      >   
      > Sicherheit ist im Zusammenspiel mit C und C++ ein potenziell heikles Thema. Programme wie der [flawfinder](http://www.dwheeler.com/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.  
        
      
      > 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. Ich bin mir sicher, dass ich den Quelltext (bei Erfolg) irgendwann freigeben werde. Bis dahin birgt es aber die Gefahr, dass sich jemand anderes den Quelltext schnappt, und einfach ein eigenes Projekt auf die Beine setzt. Dazu braucht er nur ein wenig Startkapital und eine gute Marketing-Abteilung - den Quelltext hat er dann nämlich schon.  
        
      
      > > - Gibt es gute Literaturquellen, die ihr mir bezüglich C++ als CGI empfehlen könnt?  
      >   
      > Prinzipieller Natur dürfte, falls dich C++ interessiert, das C++-Buch von Bjarne Stroustrup, dem Erfinder von C++, sein. Ansonsten gibt es im Internet haufenweise gute Dokus zum Thema sicheres Programmieren mit C und/oder CGI, wobei ich hier grad mal ein paar Links auf Lager hab, aber eine gute Suchmaschine und SELF-Kompetenz („die Community“) sollten dir weiter helfen:  
      >   
      >  \* [Secure Programming for Unix and Linux HOWTO](http://www.dwheeler.com/secure-programs)  
      >  \* [Die Datenschleuder – Wer hat Angst vorm bösen Wolf?](http://ds.ccc.de/081/insertion-attacks)  
      >  \* [The World Wide Web Security FAQ](http://www.w3.org/Security/Faq/www-security-faq.html)  
      >  \* und ein bisschen Eigenwerbung: [„Sicherheit” mit PHP/CGI, MySQL](http://robertbienert.de/dokumente/web/PHPMySQLSicherheit.html) (wird von mir grad überarbeitet)  
        
      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  
        
        
      Grüße  
        
      Marc Reichelt || <http://www.marcreichelt.de/>  
      
      -- 
      Linux is like a wigwam - no windows, no gates and an Apache inside!  
        
      Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)  
      <http://emmanuel.dammerer.at/selfcode.html>
      
      1. Hallo nochmals,

        ich möchte hierzu noch gerne eine Anmerkung machen:

        Es ist performanter, die komplette Ausgabe in einem Rutsch zu erledigen, als dafür sehr oft cout << aufzurufen. C und C++ bieten dir an, so genannte Zeichenkonstanten bis zu einer Länge von 500+etwas über mehrere Zeilen zu notieren:

        cout << "Content-Type: text/html; charset=utf-8\r\n"
                "\r\n"
                // HTML-Teil
                "<?xml version="1.0" encoding="utf-8"?>\n"
                "…";

        
        >   
        > Supi! Das ist doch schon mal eine ordentliche Steigerung.  
          
        Die Optimierung (also statt vielen cout-Vorgängen einen einzigen zu schreiben, der dann auf mehrere Zeilen verteilt wird) hat nichts gebracht. Offensichtlich erkennt der g++-Compiler der GNU Compiler Collection in der Version 4.0 dies automatisch, und sammelt die cout-Befehle zu einem einzigen zusammen. Ob die vorherigen Versionen das auch gemacht haben, kann ich nicht sagen, der 4.0er macht es auf jeden Fall.  
          
        Ach ja, und warum ich eine XHTML-Datei überhaupt als "text/html" ausgeliefert habe: Weil der IE das nicht versteht...  
          
          
        Grüße  
          
        Marc Reichelt || <http://www.marcreichelt.de/>  
        
        -- 
        Linux is like a wigwam - no windows, no gates and an Apache inside!  
          
        Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)  
        <http://emmanuel.dammerer.at/selfcode.html>
        
        1. Moin!

          Es ist performanter, die komplette Ausgabe in einem Rutsch zu erledigen, als dafür sehr oft cout << aufzurufen. C und C++ bieten dir an, so genannte Zeichenkonstanten bis zu einer Länge von 500+etwas über mehrere Zeilen zu notieren:

          cout << "Content-Type: text/html; charset=utf-8\r\n"
                  "\r\n"
                  // HTML-Teil
                  "<?xml version="1.0" encoding="utf-8"?>\n"
                  "…";

          
          > >   
          > > Supi! Das ist doch schon mal eine ordentliche Steigerung.  
          >   
          > Die Optimierung (also statt vielen cout-Vorgängen einen einzigen zu schreiben, der dann auf mehrere Zeilen verteilt wird) hat nichts gebracht. Offensichtlich erkennt der g++-Compiler der GNU Compiler Collection in der Version 4.0 dies automatisch, und sammelt die cout-Befehle zu einem einzigen zusammen.  
            
          Wie kannst du das mit Sicherheit sagen? Hast du einen Benchmark versucht oder steht das in der Manual?  
            
          
          > Ob die vorherigen Versionen das auch gemacht haben, kann ich nicht sagen, der 4.0er macht es auf jeden Fall.  
            
          Mir ist ein solches Verhalten eines Compilers generell nicht bekannt, weil er da schon fast semantisch denken müsste.  
            
          
          > Ach ja, und warum ich eine XHTML-Datei überhaupt als "text/html" ausgeliefert habe: Weil der IE das nicht versteht...  
            
          OK, aber der IE versteht dann auch nicht `<?xml version="1.0" ?>`{:.language-xml} als erste Zeile, sondern möchte den Doctype direkt sehen.  
            
          Viele Grüße,  
          Robert
          
      2. Hallo,

        Mit dem "In den Quelltext schreiben" habe ich mittlerweile keine Probleme mehr, das geht nach ein paar Jahren HTML ziemlich flüssig.

        Meiner Meinung nach ist es auch weniger das Problem, dass Du das flüssig schreiben kannst. Du mußt aber bei jeder Änderung im HTML dein C++-Progamm neu kompilieren. Außerdem wird es schlechter wartbar sein - speziell, wenn Du mal etwas weiter denkst und einen Designer mit einbeziehen mußt.
        Da sind moderne Lösungen wie JSP, ASP.NET, wie auch PHP, Ruby usw. deutlich im Vorteil, da hier die Trennung von Logik und HTML schon als Konzept besteht.

        Ciao

        1. 你好 schneemann,

          Da sind moderne Lösungen wie JSP, ASP.NET, wie auch PHP, Ruby usw.
          deutlich im Vorteil, da hier die Trennung von Logik und HTML schon als
          Konzept besteht.

          Also, gerade JSP und PHP haben genau das Gegenteil… beides lässt sich in
          den HTML-Code einbetten. Und das ist genau das Gegenteil von "Logik und
          HTML trennen". Mal abgesehen davon gibt es auch für C und C++
          Template-Bibliotheken.

          再见,
           克里斯蒂安

          --
          MMORPG-Slang | Kranke Phantasie
          Descartes sagte: 'Ich denke, also bin ich.' Ich hingegen sage: 'Ich denke nicht, also bin ich.'
          http://wwwtech.de/
          1. Hallo,

            Da sind moderne Lösungen wie JSP, ASP.NET, wie auch PHP, Ruby usw.
            deutlich im Vorteil, da hier die Trennung von Logik und HTML schon als
            Konzept besteht.

            Also, gerade JSP und PHP haben genau das Gegenteil… beides lässt sich in
            den HTML-Code einbetten. Und das ist genau das Gegenteil von "Logik und
            HTML trennen".

            PHP ist vielleicht kein so gutes Beispiel - da weiss ich nicht, ob es Tag-Libraries o. ä. gibt. Aber auch hier läßt es sich bei ein bißchen Disziplin sehr leicht erreichen, dass im Template nur noch eine Methode aufgerufen wird und somit keine Programmlogik darin untergebracht ist.

            Bei JSP (und auch ASP.NET) ist die Trennung aber durch Tag-Libraries oder ähnliche Konzepte sehr leicht zu erreichen.

            Letztendlich ist es immer so, dass der Programmierer die Trennung eigenverantwortlich vornehmen muss. Man kann mit jedem Konzept unwartbaren Code erzeugen. Bei manchen Konzepten wird dem Programmierer die Trennung von Logik und Präsentation aber vereinfacht. Und dazu gehört C++ im CGI-Bereich vermutlich eher nicht.

            Mal abgesehen davon gibt es auch für C und C++
            Template-Bibliotheken.

            Das überschreitet (leider) meinen Horizont.

            Ciao

            1. 你好 schneemann_,

              Bei JSP (und auch ASP.NET) ist die Trennung aber durch Tag-Libraries oder
              ähnliche Konzepte sehr leicht zu erreichen.

              Sicher, wird aber nicht von Haus aus mitgebracht.

              Bei manchen Konzepten wird dem Programmierer die Trennung von Logik und
              Präsentation aber vereinfacht. Und dazu gehört C++ im CGI-Bereich
              vermutlich eher nicht.

              Die Trennung ist da genau so einfach zu erreichen wie bei PHP, JSP, Java
              oder sonstwo. Es gibt dort genau so Bibliotheken, die einem die Handarbeit
              abnehmen, wie es sie für die „großen“ CGI-Sprachen auch gibt.

              Mal abgesehen davon gibt es auch für C und C++
              Template-Bibliotheken.
              Das überschreitet (leider) meinen Horizont.

              Ja, dann sag doch einfach nichts dazu ;)

              再见,
               克里斯蒂安

              --
              MMORPG-Slang | Kranke Phantasie
              Ich bewundere wirklich den Sinn der Bienen für kollektive Verantwortung. Obwohl sich einzelne Bienen hin und wieder bekämpfen, herrscht zwischen Ihnen grundsätzlich ein starkes Gefühl für Eintracht und Zusammenarbeit. Wir Menschen gelten als sehr viel weiter entwickelt, doch mitunter rangieren wir sogar hinter kleinen Insekten.
              http://wwwtech.de/
              1. Hallo,

                Das überschreitet (leider) meinen Horizont.

                Ja, dann sag doch einfach nichts dazu ;)

                Naja, da habe ich mich vielleicht etwas weit vorgewagt ;) Eigentlich wollte ich ja nur schreiben, dass es nicht zu empfehlen ist, HTML direkt heraus zu schreiben, auch wenn es einem leicht von der Hand geht, so wie es oben angedeutet wurde.

                Ciao

                1. 你好 schneemann_,

                  Eigentlich wollte ich ja nur schreiben, dass es nicht zu empfehlen ist,
                  HTML direkt heraus zu schreiben, auch wenn es einem leicht von der Hand
                  geht, so wie es oben angedeutet wurde.

                  Dem kann ich nur zustimmen.

                  再见,
                   克里斯蒂安

                  --
                  MMORPG-Slang | Kranke Phantasie
                  Wenn du gehst, gehe. Wenn du sitzt, sitze. Und vor allem: schwanke nicht!
                  http://wwwtech.de/
      3. 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