Thomas Schmieder: GB überschreibt txt datei

Beitrag lesen

Hallo,

bitte verzeih, wenn ich falsch liege, aber hier erscheint eine grundlegende Sortierphase wichtiger zu sein, als den Rat zu geben, die Datei im Append-Mode zu öffnen.

<?php
if ($name == "" || $text == "") {
     echo "Bitte alle Felder ausfüllen";
}
else {

$eintrag = "$name schrieb: <br><br> $text";

$datei = fopen("gb.txt","wr");

$datei = fopen("bg.txt","a");
wäre hier richtiger. Aber um Himmels willen nicht sofort umsetzen!!!
                     -----------------------------------------------
erst weiterlesen.

fputs($datei, $eintrag);
     fclose($datei);

echo "Eintrag erfolgreich gespeichert";
}
?>

<table width="600" border="0" cellspacing="0" cellpadding="0">

...

<tr>
      <td><div align="center">
          <?php include("gb.txt"); ?>
        </div></td>
    </tr>

in dieser Passage holst Du Deine Einträge wiedr aus der Textdatei heraus und stellst sie Deinem Script mit voller Mächtigkeit zur Verfügung. Das bedeutet aber, dass es möglich wäre, dass Dir jemand PHP-Scripte in Dein Gästebuch schreibt, die direkt Anwaeisungen an das Betriebssystem geben können oder sonst irgendwelchen Schaden anrichten können. Einziger Schutz, den ich hier vermute, ist ein eingeschaltetes "magic_quotes" auf dem Server. Dadurch werden z.B. Anführungszeichen escaped -> mit einem Backslash versehen. Es wird also etwas schwieriger, dir schädliche Funktionen ins Gästebuch zu schreiben...

Der Befehl "include" ist grundsätzlich nicht dafür geeignet, serverfremde Dateien, also solche von Nobodies, in Dein Script einzubinden.

Du solltest an dieser Stelle besser den Befehl readfile() benutzen, der eine gespeicherte Datei direkt auf den Browser ausgibt. Allerdings kann der dazu führen, dass der gesamte HTML-Rahmen um die Ausgabe herum zerstört wird (unbalanciert usw). Denn noch hast Du nicht geprüft, was die Benutzer gesendet haben.

Du solltest also nichts speichern, was nicht von Dir geprüft wurde. Dafür bietet PHP verschiedene Funktionen:

strip_tags()      entfernt html-tags mit Ausnahme der erlaubten

htmlspecialchars()wandelt alle html-Sonderzeichen in Ersetzungsseqzenzen
                  (¨ ß etc ) um.

stripslashes()    Um die Backslashes wieder zu entfernen; aber
                  bitte nicht ohne die anderen Prüfungen vorher

nl2br()           wandelt Zeilenumbrüche aus einer Textarea in <br /> um
                  bei älteren PHP-Versionen nur in <br>

Du solltest Dir ausßerdem über ein Datensatzformat Gedanken machen, dass Du dann abspeichern kannst. In so einem Datensatz könnte stehen:

IP          des Gästebuchbenutzers
Datum       des Eintrages
Uhrzeit     des Eintrages
eMail       des Eintragers wenn er sie eingetragen hat
Website     des Eintragers, wenn er sie angegeben hat
Titel       falls er eine Überschrift wollte
Text        die eigentliche Message
Antwort     Deine Erwiderung auf den Eintrag.

Diese ganzen Daten bindest Du am besten in einem Array und verpackst sie dann mit der Funktion

serialize() Diese Funktion verpackt ganze Datenstrukturen in Strings.

in einem String, den Du in der Datei abspeichern kannst.

Wenn Du später Dein Gästebuch mittels einer Schleife anzeigen lässt, entpackst Du dieses Array mit

unserialize()

und alle Daten stehen Dir wieder in einzelnen Array-Elementen zur Verfügung. Wie man die ausgibt, weißt Du ja schon.

Ach, noch etwas. Um die gesamte Datei erstmal einzulesen schau Dir mal die Funktion

file()      liest eine Textdatei vollständig ein und speichert jede Zeile
            in einem Array-Element. Am Ende des Elementes hängt noch das
            Zeilenende-Zeichen, das z.B. vor einem unserialize() abgeschnitten
            werden sollte.

So, viel neuer Stoff. Du hast also gut zu tu, Pack es an.

Liebe Grüße aus http://www.braunschweig.de

Tom

--
Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.