Rosalie Th.: "?>" in Varible

Mit einem Script erstelle ich neue *.php Dateien. Der Inhalt dieser Dateien besteht lediglich aus:

<? $baeckerid=$str_personal_id; include("vorlage.php"); ?>

Das Script, welches diese Dateien herstellt:

$text = "<? $baeckerid=".$str_personal_id."; include("vorlage.php");";  
$dateiname = "".$str_baecker_name.".php"; // Name der Datei  
// Datei öffnen,  
// wenn nicht vorhanden dann wird die Datei erstellt.  
$handler = fOpen("./mitarbeiter/$dateiname" , "a+");  
// Dateiinhalt in die Datei schreiben  
fWrite($handler , $text);  
fClose($handler); 

Mein Problem ist, dass ich in der ersten Zeile meines Scriptes das abschliessende Tag "?>" nicht in die Variable kriege. (Das eröffende macht soweit keine Probleme).

Meine Frage an Euch: was mache ich falsch?

Es grüsst freundlich,
Rosa

  1. Mein Problem ist, dass ich in der ersten Zeile meines Scriptes das abschliessende Tag "?>" nicht in die Variable kriege. (Das eröffende macht soweit keine Probleme).

    Meine Frage an Euch: was mache ich falsch?

    "Kurz": dir ist nicht bekannt, dass man zur Syntax gehörende Zeichen-(ketten) entsprechend ihrem Kontext richtig behandeln muss - in diesem Fall musst du die Zeichen lediglich maskieren.

    "Lang": du scheinst zu versuchen, mit PHP weiter PHP-Dateien zu erzeugen die du dann ggf. mit eval oder include aufrufen/ausführen kannst. Dieses Vorhaben zeugt von einer enormen konzeptionellen Schwäche in deinem System oder einer grundlegenden Wissenlücke in Sachen Programmiertechnik deinerseits.

    1. Dieses Vorhaben zeugt von einer enormen konzeptionellen Schwäche in deinem System oder einer grundlegenden Wissenlücke in Sachen Programmiertechnik deinerseits.

      Den Nagel auf den Kopf getroffen mein Lieber! Könntest Du mich bitte erleuchten? Oder: Bin nicht die hellste Torte auf der Kerze ;-)

      1. Dieses Vorhaben zeugt von einer enormen konzeptionellen Schwäche in deinem System oder einer grundlegenden Wissenlücke in Sachen Programmiertechnik deinerseits.

        Den Nagel auf den Kopf getroffen mein Lieber! Könntest Du mich bitte erleuchten? Oder: Bin nicht die hellste Torte auf der Kerze ;-)

        Wenn du erklären kannst, was du da eigentlich bezweckst, ist das ggf. nicht schwierig :)

        1. Suit, dies habe ich doch in meinem ersten Post geschildert. Es sollen dynamisch neue *.php-Seiten mit dem Inhalt:
          <? $baeckerid=$str_personal_id; include("vorlage.php"); ?>
          erstellt werden.

          Schlussendlich soll folgendes möglich sein:
          <? $test="<? echo"Hallo Suit"; ?>"; ?>

          Habe mich natürlich sofort betreffend Deinem Tipp "maskieren" umgeschaut. Leider klappt es noch nicht so wie ich will...

          Bedeutet "?>" richtig zu maskieren:
          ?> -> geht nicht
          ?> -> macht keinen Sinn für mich. Es steht dann genau so in der Ziel-PHP-Datei
          ?&gt; -> Steht auch so in der Zieldatei

          Rosa

          1. Suit, dies habe ich doch in meinem ersten Post geschildert. Es sollen dynamisch neue *.php-Seiten mit dem Inhalt:
            <? $baeckerid=$str_personal_id; include("vorlage.php"); ?>
            erstellt werden.

            Ja, das ist mir klar - und das ist dämlich.

            Ich wollte wissen was du machen möchtest (dein Vorhaben) nicht, was du machst (deinen Lösungsansatz).

            Schlussendlich soll folgendes möglich sein:
            <? $test="<? echo"Hallo Suit"; ?>"; ?>

            Mehr als dämlich.

            Habe mich natürlich sofort betreffend Deinem Tipp "maskieren" umgeschaut. Leider klappt es noch nicht so wie ich will...

            http://en.wikibooks.org/wiki/Complete_PHP_Programming/Escaping_from_HTML#XML_declaration_and_Short_tags

            Dennoch wir das dein eigentlichen Problem nicht lösen, es wird nur bewirken, dass deine dämliche Lösung das tut, was du möchtest - sie wird dir aber über kurz oder lang das Genick brechen.

            Deine entscheidung.

            1. Es gibt eine Mitarbeiter-Datenbank. Mit ID, Name, Skills, etc.
              Die DB hat schon über 200 Einträge.
              Ich will (es muss!), dass innerhab der Website jeder Mitarbeiter seine eigene Seite erhält. Also www.meinedomain.net/rudolf.php
              Weil ich nicht jede der über 200 Seiten selber kopieren und die Namen anpassen will, will ich ein Script dies machen lassen.

              Damit ich nur eine (Vorlage) Seite habe, wird diese in die jeweilige Mitarbeiter-Seite included. Dank der Variable $baeckerid kann ich den Rest des Profils aus der DB saugen.
              So kann flexibel das Aussehen aller über 200 Seiten nach Wunsch angepasst werden.

              Ich sehe, dass mein Lösungsansatz doof ist. Was übersehe ich? Es scheint so, dass ich auf dem Schlauch stehe.

              Danke für die Hilfe
              Rosa

              1. Ich sehe, dass mein Lösungsansatz doof ist. Was übersehe ich? Es scheint so, dass ich auf dem Schlauch stehe.

                Ja, schreibe ein Script welches sich die jeweiligen Benutzerdaten aus der Datenbank liest - das ist die Übiche vorgehensweise.

              2. Mahlzeit Rosalie Th.,

                Es gibt eine Mitarbeiter-Datenbank. Mit ID, Name, Skills, etc.

                Und diese Informationen sollen auch irgendwo angezeigt werden?

                Die DB hat schon über 200 Einträge.

                Schon? Ich würde das eher als *kleine* Datenmenge bezeichnen ...

                Ich will (es muss!), dass innerhab der Website jeder Mitarbeiter seine eigene Seite erhält. Also www.meinedomain.net/rudolf.php

                Welchen Webserver nutzt Du? Falls Apache: Informiere Dich zum Thema "mod_rewrite".

                Weil ich nicht jede der über 200 Seiten selber kopieren und die Namen anpassen will, will ich ein Script dies machen lassen.

                Das ist fehleranfällig und nahezu unkontrollierbar. Lass lieber den Webserver die Arbeit machen - so könnte z.B. durch o.g. Modul jede Anfrage nach "example.com/rudolf.php" intern in eine Anfrage an "example.com/mitarbeiter.php?name=rudolf" umgeschrieben werden ... und schon musst Du nur ein Skript pflegen. Dieses kann dann die entsprechenden Daten aus der Datenbank fischen und anzeigen.

                MfG,
                EKKi

                --
                sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          2. Hello,

            Schlussendlich soll folgendes möglich sein:
            <? $test="<? echo"Hallo Suit"; ?>"; ?>

            Dann schreib doch

              
              <?php  
                  $test = "<" . "?php echo \"Hallo Suit\"; ?" . ">";  
              ?>  
            
            

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Danke Tom, so funktioniert es! Nun hoffe ich, dass mir das nicht das Genick bricht, so wie mir das Suit prophezeit hat!?

              Rosa

              1. Hello,

                Danke Tom, so funktioniert es! Nun hoffe ich, dass mir das nicht das Genick bricht, so wie mir das Suit prophezeit hat!?

                Das können wir Dir nur sagen, wenn wir dein Gesamtkunstwerk kennen.
                Es ist aber keine gute Idee, Usern freien Zugriff auf die Gestaltung von Scripten zu geben. Solange dein System sauber aufgebaut ist, kann es durchaus Fälle geben, in denen generierter Code sinnvoll ist.

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Das können wir Dir nur sagen, wenn wir dein Gesamtkunstwerk kennen.

                  Diese Information reicht mir persönlich schon um sagen zu können, dass es mit ziemlicher Sicherheit sehr unklug ist.

                  1. Diese Information reicht mir persönlich schon um sagen zu können, dass es mit ziemlicher Sicherheit sehr unklug ist.

                    Warum? Oder anders gefragt: Wie wäre es klug gelöst Deiner Meinung nach?

                    1. Warum? Oder anders gefragt: Wie wäre es klug gelöst Deiner Meinung nach?

                      Siehe EKKi.

                2. Es ist aber keine gute Idee, Usern freien Zugriff auf die Gestaltung von Scripten zu geben. Solange dein System sauber aufgebaut ist, kann es durchaus Fälle geben, in denen generierter Code sinnvoll ist.

                  Nur ich habe Zugriff auf den Code. Und nur ich generiere die neuen Seiten. Darum habe ich derzeit keine Bedenken. Auch wenn die Lösung nicht ganz sauber sein mag.

                  1. Nur ich habe Zugriff [...] Darum habe ich derzeit keine Bedenken. Auch wenn die Lösung nicht ganz sauber sein mag.

                    Ja, das sagen die Amerikaner auch wenn sie DU-Penetratoren rechtfertigen ;)

            2. Hi!

              $test = "<" . "?php echo "Hallo Suit"; ?" . ">";

              Warum trennst du denn unnötigerweise den String auf? Innerhalb von ordnungsgemäß eingefassten Strings haben nur die dokumentierten Zeichen eine Sonderbedeutung.

              $test = "<?php echo "Hallo Suit"; ?>";

              Und mit '' spart man sich auch noch das Maskieren der "

              $test = '<?php echo "Hallo Suit"; ?>';

              Lo!

              1. Hello,

                $test = "<" . "?php echo "Hallo Suit"; ?" . ">";

                Warum trennst du denn unnötigerweise den String auf?

                Weil ich nicht weiß, wo der gesamte Zuweisungsstring dann wieder landet. Ich könnte mir vorstellen, dass der dann wieder in einer Datei steht, die eingelesen wird. Irgendwann wird es unübersichtlich, was das Ganze ja auch gefährlich macht.

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Hi!

                  $test = "<" . "?php echo "Hallo Suit"; ?" . ">";
                  Warum trennst du denn unnötigerweise den String auf?
                  Weil ich nicht weiß, wo der gesamte Zuweisungsstring dann wieder landet. Ich könnte mir vorstellen, dass der dann wieder in einer Datei steht, die eingelesen wird. Irgendwann wird es unübersichtlich, was das Ganze ja auch gefährlich macht.

                  Das ist kein Grund. Wenn man beim Programmieren die Übersicht verliert, sollte man es lassen. Gefährlichkeit bekommt man nicht durch irgendwelche obskuren Maßnahmen weg, sondern durch überlegtes Handeln.

                  Lo!

                  1. Hello,

                    $test = "<" . "?php echo "Hallo Suit"; ?" . ">";
                    Warum trennst du denn unnötigerweise den String auf?
                    Weil ich nicht weiß, wo der gesamte Zuweisungsstring dann wieder landet. Ich könnte mir vorstellen, dass der dann wieder in einer Datei steht, die eingelesen wird. Irgendwann wird es unübersichtlich, was das Ganze ja auch gefährlich macht.

                    Das ist kein Grund. Wenn man beim Programmieren die Übersicht verliert, sollte man es lassen. Gefährlichkeit bekommt man nicht durch irgendwelche obskuren Maßnahmen weg, sondern durch überlegtes Handeln.

                    Genau deshalb habe ich auch den String aufgetrennt. Dann können der Parser oder die Funktionen eines Programmierers an dieser Stelle ruhig mal eine Fehler machen. Der String wird aber garantiert in der gewünschten Form eingeschrieben :-D

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                     ☻_
                    /▌
                    / \ Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
    2. Hallo.

      "Lang": du scheinst zu versuchen, mit PHP weiter PHP-Dateien zu erzeugen die du dann ggf. mit eval oder include aufrufen/ausführen kannst. Dieses Vorhaben zeugt von einer enormen konzeptionellen Schwäche in deinem System oder einer grundlegenden Wissenlücke in Sachen Programmiertechnik deinerseits.

      Was ist generell schlecht daran?
      Man könnte z.B. die Möglichkeit geben eine config.inc.php online zu bearbeiten. Diese würde abgespeichert werden und in jede Datei eingebunden werden (mittels include).

      Wie könnte man es besser machen?

      1. Hi,

        "Lang": du scheinst zu versuchen, mit PHP weiter PHP-Dateien zu erzeugen die du dann ggf. mit eval oder include aufrufen/ausführen kannst. Dieses Vorhaben zeugt von einer enormen konzeptionellen Schwäche in deinem System oder einer grundlegenden Wissenlücke in Sachen Programmiertechnik deinerseits.
        Was ist generell schlecht daran?

        bei böswilliger Betrachtung das Sabotagepotential, bei gutmütiger Betrachtung die Unfallgefahr.

        Man könnte z.B. die Möglichkeit geben eine config.inc.php online zu bearbeiten. Diese würde abgespeichert werden und in jede Datei eingebunden werden (mittels include).

        Ja. Aber wenn solche Konfigurations-Einstellungen als ausführbarer Code gespeichert werden, besteht immer auch die Möglichkeit, unerwünschten Code in diese Dateien zu packen. Das muss nicht unbedingt ein Hacker-Angriff sein, ein dummer Zufall, ein Versehen reicht eventuell schon. Oder eine dynamisch erzeugte Anweisung ist syntaktisch falsch, und schon bricht das gesamte Script ab.

        Wie könnte man es besser machen?

        Solche Informationen nur als reine Daten speichern, und programmgesteuert lesen und auswerten. Das geht schon recht komfortabel, wenn man beispielsweise das ini-Format verwendet.

        So long,
         Martin

        --
        Eine Neandertaler-Sippe sitzt in ihrer kalten Höhle. Seufzt der Stammesälteste: "Hoffentlich erfindet bald jemand das Feuer!"
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hallo.

          Ja. Aber wenn solche Konfigurations-Einstellungen als ausführbarer Code gespeichert werden, besteht immer auch die Möglichkeit, unerwünschten Code in diese Dateien zu packen. Das muss nicht unbedingt ein Hacker-Angriff sein, ein dummer Zufall, ein Versehen reicht eventuell schon. Oder eine dynamisch erzeugte Anweisung ist syntaktisch falsch, und schon bricht das gesamte Script ab.

          Das hat für mich jetzt erst mal nichts mit der Art der Verarbeitung der (Config-)Datei zu tun sondern mit der Validierung der Daten (vor der Abspeicherung in der Config-Datei).

          Solche Informationen nur als reine Daten speichern, und programmgesteuert lesen und auswerten. Das geht schon recht komfortabel, wenn man beispielsweise das ini-Format verwendet.

          Aber das parsen einer ini-Datei ist doch bestimmt langsamer als das "normale" Einlesen der PHP-Datei (oder?).
          Und gerade der Lese-Vorgang einer Datei die überall benötigt wird sollte doch schnell gehen.

          Grüße!

          1. Hi,

            Aber wenn solche Konfigurations-Einstellungen als ausführbarer Code gespeichert werden, besteht immer auch die Möglichkeit, unerwünschten Code in diese Dateien zu packen. Das muss nicht unbedingt ein Hacker-Angriff sein, ein dummer Zufall, ein Versehen reicht eventuell schon. Oder eine dynamisch erzeugte Anweisung ist syntaktisch falsch, und schon bricht das gesamte Script ab.
            Das hat für mich jetzt erst mal nichts mit der Art der Verarbeitung der (Config-)Datei zu tun sondern mit der Validierung der Daten (vor der Abspeicherung in der Config-Datei).

            das ist die eine Seite der Medaille. Aber die Datei kann ja auch verändert oder ersetzt werden, *nachdem* sie einmal korrekt erzeugt wurde.

            Solche Informationen nur als reine Daten speichern, und programmgesteuert lesen und auswerten. Das geht schon recht komfortabel, wenn man beispielsweise das ini-Format verwendet.
            Aber das parsen einer ini-Datei ist doch bestimmt langsamer als das "normale" Einlesen der PHP-Datei (oder?).

            Ich hab's nicht ausprobiert, aber ich denke, dass die ini-Datei sogar die Nase vorn hat. Denn eine Include-Datei mit PHP-Code muss auch erst vom Parser analysiert und im Arbeitsspeicher compiliert werden, der Vorgang braucht auch Zeit.

            Und gerade der Lese-Vorgang einer Datei die überall benötigt wird sollte doch schnell gehen.

            Ja. Und da bin ich überzeugt, dass das Lesen und Interpretieren einer auf das Datenformat optimierten Datei (muss nicht das ini-Format sein, das war nur ein Beispiel) schneller geht, als das Lesen, Analysieren und Übersetzen von Programmcode.

            Ciao,
             Martin

            --
            Der geistige Horizont ist der Abstand zwischen Brett und Hirn.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          2. Hi!

            Aber das parsen einer ini-Datei ist doch bestimmt langsamer als das "normale" Einlesen der PHP-Datei (oder?).
            Und gerade der Lese-Vorgang einer Datei die überall benötigt wird sollte doch schnell gehen.

            Darum geht es im Prinzip nicht. Der Unterschied wird vorhanden sein, aber er wird beine bedeutende Rolle spielen. In der gesamten Verarbeitungskette zwischen Browser, Netzwerk, Server und zurück, wird wird es größere Zeitfresser geben als den Unterschied zwischen ini-Datei und PHP-Code. Selbst wenn du die Einsparungen auf dem Server allein betrachtest und zusammenzählst, wirst du vermutlich keinen signifikant höheren Durchsatz an Requests pro Zeiteinheit erreichen können. Mit anderen Worten: Lass die Performance-Frage erstmal weg und vergleiche beide (und vielleicht weitere) Methoden auf ihre Handhabbarkeit, auch in puncto Maßnahmen gegen ungewollte Codeausführung.

            Lo!

  2. Hi!

    Mein Problem ist, dass ich in der ersten Zeile meines Scriptes das abschliessende Tag "?>" nicht in die Variable kriege. (Das eröffende macht soweit keine Probleme).
    Meine Frage an Euch: was mache ich falsch?

    Da du nicht zeigst, was du machst, um es nicht hinzubekommen, kann ich dir nciht sagen, was du verkehrt machst. Beides sind ganz normale Zeichen innerhalb eines Strings, können also problemlos darin vorkommen.

    Unabhängig davon bin auch ich der Meinung, dass es möglicherweise eine bessere Lösung für die eigentliche Aufgabenstellung gibt, als sich selbst modifizierender Code.

    Lo!

    1. Hi!

      Da du nicht zeigst, was du machst, um es nicht hinzubekommen, kann ich dir nciht sagen, was du verkehrt machst. Beides sind ganz normale Zeichen innerhalb eines Strings, können also problemlos darin vorkommen.

      Was aber so nicht geht, " in "" schachteln, denn dann findet der Parser schon beim ersten " das Ende vom String. Dazu muss man die Notationsregeln für Strings beachten.

      Lo!