Raffi: HTML Datei zum bearbeiten in Textarea laden

Hallo Leute ich möchte eine Datei in eine TExtarea laden um Änderungen am HTML Quelltext online vorzunehmen.

Habe das so versucht:

<?
 $file = $edit_file;
 readfile($file);
 ?>

Geht aber irgendwie nicht ganz - Da einzelne Teile des HTML Files ausserhalb der Textarea ausgeführ werden (z.B. Background Color).

Benutze ich den falschen Befehl?

Gruss
Raffi

  1. Hallo Raffi,

    Benutze ich den falschen Befehl?

    Ja. Du musst HTML-Sonderzeichen maskieren:

    <?php

    $inhalt = implode ('', file ($edit_file));

    echo htmlspecialchars ($inhalt);

    ?>

    Sonst wird HTML-Quelltext direkt in die Seite geschrieben.

    Viele Grüße,
    Christian

    1. Und wie mach ich das dann beim zurückschreiben?

      Habe bei php.net keinen entsprechenden "Gegenbefehl" zu htmlspecialchars gefunden.

      gruss
      raffi

      1. Hallo Raffi,

        Und wie mach ich das dann beim zurückschreiben?

        Wenn die Daten per POST kommen, sind diese nicht mehr kodiert. Denn die HTML-Kodierung wird vom Browser beim Auslesen der Datei automatisch dekodiert.

        Viele Grüße,
        Christian

        1. Das heisst wenn ich das File per Post an einen Save-Script übergebe ist alles ok?

          Mit welchem Befehl würdest Du saven? Die ganze Datei (Inhalt) soll ja ersetzt werden.

          Danke und Gruss
          Raffi

          1. Hallo Raffi,

            Das heisst wenn ich das File per Post an einen Save-Script übergebe ist alles ok?

            Ja.

            Mit welchem Befehl würdest Du saven? Die ganze Datei (Inhalt) soll ja ersetzt werden.

            fopen -> fwrite -> fclose

            Viele Grüße,
            Christian

            1. Hallo Christian

              Herzlichen Dank für Deine Hilfe. Das funktioniert soweit...das Einzige Problem ist, dass der Inhalt am Ende angehängt wird. Wie kann ich zuerst den ganzen Inhalt des Files löschen?

              Gruss
              Raffi

              1. Hallo Raffi,

                das Einzige Problem ist, dass der Inhalt am Ende angehängt wird. Wie kann ich zuerst den ganzen Inhalt des Files löschen?

                ?? Wie öffnest Du denn Deine Datei?

                Wenn dort

                $handle = fopen ($dateiname, 'w');

                steht, (mit den entsprechend anderen Variablennamen) dann wird automatisch der komplette Inhalt überschrieben. Wenn Du natürlich statt 'w' ein 'a' dort stehen haben solltest, dann brauchst Du Dich nicht zu wundern. Das ganze steht aber in der Dokumentation zu fopen.

                Viele Grüße,
                Christian

              2. Das mit dem Löschen des Inhalts hab ich gerade gefunden....aber irgendwie speichert der einen völligen mist:

                <body>
                <form name="form1" method="post" action="">
                  <textarea name="textarea" cols="200" rows="20">
                    Test bla bla bla
                  </textarea>
                </form>
                </body>
                </html>

                Muss ich das noch irgendwie filtern damit er keine \ vor die " macht?

                Hier mein Script:

                <?php
                $filename = $edit_file;
                $somecontent = $htmledit;

                // Sichergehen, dass die Datei existiert und beschreibbar ist

                $filename = substr($edit_file, 2);
                $filename = "/home/focusnet/public_html".$filename;

                print $filename;
                print '<br>';

                if (is_writable($filename)) {

                // Wir öffnen $filename im "Anhänge" - Modus.
                    // Der Dateizeiger befindet sich am Ende der Datei, und
                    // dort wird $somecontent später mit fwrite() geschrieben.
                    if (!$handle = fopen($filename, "w+")) {
                         print "Kann die Datei $filename nicht öffnen";
                         exit;
                    }

                // Schreibe $somecontent in die geöffnete Datei.
                    if (!fwrite($handle, $somecontent)) {
                        print "Kann in die Datei $filename nicht schreiben";
                        exit;
                    }

                print "Fertig, in Datei $filename wurde geschrieben";

                fclose($handle);

                } else {
                    print "Die Datei $filename ist nicht schreibbar";
                }
                ?>

                Gruss
                Raffi

                1. Hallo Raffi,

                  Muss ich das noch irgendwie filtern damit er keine \ vor die " macht?

                  *argh* (das gilt jetzt nicht Dir sondern PHP) Es gibt eine Einstellung in der php.ini, die magic_quotes_gpc heißt. Diese Einstellung bewirkt, dass vor ", \ und ' automatisch \ gestellt wird, damit Variablen sicher in Datenbankabfragen verwendet werden können. Die Tatsache, dass die wenigsten Variablen auch in eine Datenbank kommen, ist anscheinend nicht berücksichtigt worden.

                  Ich verwende am Anfang meiner Scripte immer folgenden Code, um diese Ärgernis zu umgehen:

                  // needed for disabling magic quotes gpc which is sometimes activated
                  function recursive_stripslashes ($value) {
                    if (is_array ($value)) {
                      return array_map ('recursive_stripslashes', $value);
                    } else {
                      return stripslashes ($value);
                    }
                  }

                  // make sure that we have got magic_quotes_gpc disabled
                  // (and beg that this script is not subject of a DoS-attac)
                  if (get_magic_quotes_gpc ()) {
                    $_GET = recursive_stripslashes ($_GET);
                    $_POST = recursive_stripslashes ($_POST);
                    $_COOKIE = recursive_stripslashes ($_COOKIE);
                  }

                  // deactivate other magic quote stuff
                  set_magic_quotes_runtime (0);

                  Du musst dann halt aufpassen, wenn Du Sachen in einer Datenbankabfrage verwendest, dann musst Du mit mysql_escape_string für MySQL u.ä. für andere Datenbanken diese Escape-Zeichen wieder hinzufügen, sonst hast Du eine Sicherheitslücke.

                  Viele Grüße,
                  Christian

                  1. Hallo Christian

                    Geht leider immernoch nicht:

                    <?php
                    // needed for disabling magic quotes gpc which is sometimes activated
                    function recursive_stripslashes ($value) {
                      if (is_array ($value)) {
                        return array_map ('recursive_stripslashes', $value);
                      } else {
                        return stripslashes ($value);
                      }
                    }

                    // make sure that we have got magic_quotes_gpc disabled
                    // (and beg that this script is not subject of a DoS-attac)
                    if (get_magic_quotes_gpc ()) {
                      $_GET = recursive_stripslashes ($_GET);
                      $_POST = recursive_stripslashes ($_POST);
                      $_COOKIE = recursive_stripslashes ($_COOKIE);
                    }

                    // deactivate other magic quote stuff
                    set_magic_quotes_runtime (0);

                    $filename = $edit_file;
                    $somecontent = $htmledit;

                    // Sichergehen, dass die Datei existiert und beschreibbar ist

                    $filename = substr($edit_file, 2);
                    $filename = "/home/focusnet/public_html".$filename;

                    print $filename;
                    print '<br>';

                    if (is_writable($filename)) {

                    // Wir öffnen $filename im "Anhänge" - Modus.
                        // Der Dateizeiger befindet sich am Ende der Datei, und
                        // dort wird $somecontent später mit fwrite() geschrieben.
                        if (!$handle = fopen($filename, "w")) {
                             print "Kann die Datei $filename nicht öffnen";
                             exit;
                        }

                    // Schreibe $somecontent in die geöffnete Datei.
                        if (!fwrite($handle, $somecontent)) {
                            print "Kann in die Datei $filename nicht schreiben";
                            exit;
                        }

                    print "Fertig, in Datei $filename wurde geschrieben";

                    fclose($handle);

                    } else {
                        print "Die Datei $filename ist nicht schreibbar";
                    }
                    ?>

                    Habe ich das falsch eingebunden?

                    Gruss
                    Raffi

                    1. Hallo Raffi,

                      Habe ich das falsch eingebunden?

                      Nein. Allerdings gehe ich davon aus, dass niemand mehr register_globals verwendet, sondern stattdessen $_GET, $POST und $_COOKIE verwendet. Du verwendest aber immernoch register_globals. Wenn es Dir nur um diese eine Script geht, dann kannst Du mit einem

                      if (get_magic_quotes_gpc ()) {
                        $somecontent = stripslashes ($somecomment);
                      }

                      anstelle meines anderen Codes das Problem lösen.

                      Viele Grüße,
                      Christian

                  2. Muss ich das noch irgendwie filtern damit er keine \ vor die " macht?

                    *argh* (das gilt jetzt nicht Dir sondern PHP) Es gibt eine Einstellung in der php.ini, die magic_quotes_gpc heißt. Diese Einstellung bewirkt, dass vor ", \ und ' automatisch \ gestellt wird, damit Variablen sicher in Datenbankabfragen verwendet werden können. Die Tatsache, dass die wenigsten Variablen auch in eine Datenbank kommen, ist anscheinend nicht berücksichtigt worden.

                    es ist m.e. vielmehr die tatsache berücksichtigt worden, dass viele DAUs einfach alles ungeprüft in ihre (my)sql-query reinschreiben, was vom browser übergeben wird, und danach jammern, wenn jemand ihre tabellen gedropped hat...

                    1. Hallo wahsaga,

                      es ist m.e. vielmehr die tatsache berücksichtigt worden, dass viele DAUs einfach alles ungeprüft in ihre (my)sql-query reinschreiben, was vom browser übergeben wird, und danach jammern, wenn jemand ihre tabellen gedropped hat...

                      Genau deswegen würde ich diese Einstellung NICHT aktivieren. Denn sonst werden die DAUs immer DAUs bleiben, wenn man ihnen alles sicherheitskritisches abnimmt. Wir sehen es ja bei den GUI-Anwendungen - wenn auf die falsche Weise versucht wird, zu vereinfachen, dann setzen sich Irrgläuben in den Köpfen fest, die nicht so leicht wieder wegzubekommen sind. Und diese führen dann hinterher zu größeren Problemen.

                      Meiner Ansicht nach wäre es viel sinnvoller, wenn man die Tutorials für Anfänger so schreibt, dass genau dieser Sachverhalt auch erklärt wird.

                      Viele Grüße,
                      Christian