dedlfix: Sicherer PHP Code?

Beitrag lesen

echo $begrüßung;

Ich hab das Script erweitert, und eine flexiblere Funktion für die Backslashes hinzugefügt, entnommen dem PHP-Manual.

Im Allgemeinen ist es nicht notwendig, die Keys zu entslashen. Normalerweise verwendet man ja selbst solche kritischen Zeichen in den Keys nicht. Wenn irgendwer falsche Keys einschleust, hat das auch keine Auswirkungen, wenn man nur auf bekannte Keys zugreift. Mit foreach durch $_POST/$_GET durchzulaufen und ungeprüft alles zu übernehmen, ist auch nicht das, was man mit wachem Verstand und Problembewusstsein macht. Es reicht also die einfache Variante des Example#2 von Disabling Magic Quotes.

Ich kriege allerdings trotz des try-catch-Blockes ein 'Warning' wegen fopen, wenn die txt.xml fehlt und ich das Dokument frisch aufrufe (also ohne gesetztes $_POST["textfeld']), warum ?!

try-catch wirkt nur für Exceptions. Eine solche werfen aber die PHP-Funktionen nicht. Nur in einigen neueren Extensions, die sich auch objektorientiert verwenden lassen, gibt es mitunter Exceptions. Da du das Ergebnis nun auswertest, kannst du fopen() mit einem @ "dekorieren".

Ausserdem, ist folgendes korrekt? Text, der z.b. als '&lt;text&gt;&lt;/text&gt;' in der Textarea steht und dann abgeschickt wird, wird wieder zurückgewandelt in die eigentlichen Zeichen, entsprechend der im Dokument verwendeten Zeichencodierung und kommt dann beim verarbeitenden Script als z.B. '<text></text>' an.

Wenn der Text '<text></text>' in einem HTML-Kontext stehen soll, muss er wie von dir genannt notiert werden, damit der Browser ihn als Text und nicht als Code ansieht. HTML ist ja ebenso wie ein SQL-Statement eine Mischung aus Code und Daten. Deshalb muss man da besondere Vorkehrungen treffen, um das eine von dem anderen zu unterscheiden. Wenn Daten vom Browser zum Server gesendet werden, kümmert sich der Browser um eine kontextgerechte Behandlung (Kontext ist nun HTTP). Du bekommst davon normalerweise nichts mit, denn PHP entfernt die "Transportsicherung", bevor es $_POST und $_GET befüllt (und anschließend gegebenenfalls mit Magic Quotes verhunzt).

$dateihandler = fopen($quelle, "w+");
            if (!$dateihandler) throw new Exception('konnte '.$quelle.' nicht zum Schreiben öffnen...');
            else {
                fwrite($dateihandler, $inhalt);
                fclose($dateihandler);
            }

Da du durch das Werfen der Exception im Fehlerfall diesen Abschnitt komplett verlässt, ist es nicht mehr notwendig, die Anweisungen im else-Block in einem solchen zu notieren. Bei erfüllter if-Bedingung wird dieser Zweig aufgrund der Exception sowieso nicht erreicht. Deshalb muss er nicht aus dem normalen Fluss augeklammert werden.

fwrite() kann übrigens auch fehlschlagen, nämlich dann, wenn beim Schreiben der zur Verfügung stehende Platz ausgeschöpft wurde. In dem Fall gibt es auch ein false zurück. Ob ebenfalls eine PHP-Meldung ausgegeben wird, entzieht sich meiner Kenntnis.

echo "$verabschiedung $name";