Franz: Text aus Datenbank sicher und richtig formatiert ausgeben

Hallo.

Wie gebe ich Text sicher und formatiert aus?

Bisher habe ich es so gemacht: nl2br(htmlspecialchars($text))

das Problem ist aber wenn der Text so lautet:

Hallo mein Name ist Franz, man nennt mich auch den "Goldfischbären".

Dann sieht die Ausgabe so aus:

Hallo mein Name ist Franz, man nennt mich auch den "Goldfischbären".

Ich möchte die Zeichen aber nicht escaped haben.

Gruß, Franz

  1. hallo,

    Ich möchte die Zeichen aber nicht escaped haben.

    echo stripslashes($text);

    stripslashes() entfernt sie.

    --
    "Sir! We are surrounded!" - "Excellent! We can attack in any direction!"
    1. Hi. Das ist mir bewusst.
      Aber geht das nicht einfacher als mit:

      stripslashes(nl2br(htmlspecialchars($text))) ??

      Ich meine das sind 3 Funktionen für jeden Text...

      1. Hello,

        Hi. Das ist mir bewusst.
        Aber geht das nicht einfacher als mit:

        stripslashes(nl2br(htmlspecialchars($text))) ??

        Ich meine das sind 3 Funktionen für jeden Text...

        ...die man aber auch gleich bei der Datenübernahme rekursiv auf das jeweils betroffene Array anwenden könnte.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo Tom.

          ...die man aber auch gleich bei der Datenübernahme rekursiv auf das jeweils betroffene Array anwenden könnte.

          Hallo Bahnhof.

          Also ich verstehe den Satz so das ich diese 3 Funktionen direkt bei der übergabe des Query-Results ins Array anwende.
          Das ist aber egal, denn es ändert nichts an dem Rechenaufwand, das für jede Ausgabe 3 Funktionen aufgerufen werden.

          Gruß, Franz

          1. Hello,

            ...die man aber auch gleich bei der Datenübernahme rekursiv auf das jeweils betroffene Array anwenden könnte.

            Hallo Bahnhof.

            Also ich verstehe den Satz so das ich diese 3 Funktionen direkt bei der übergabe des Query-Results ins Array anwende.

            Na gut, dann eben direkt vor der Ausgabe. Das wäre in diesem Falle wohl richtiger.
            siehe Artikel http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/

            Das ist aber egal, denn es ändert nichts an dem Rechenaufwand, das für jede Ausgabe 3 Funktionen aufgerufen werden.

            Was meinst Du, wieviele Funktionen bei Windows (kaskadiert) aufgerufen werden, wenn ein Fenster neu Aufgebaut wird?

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
    2. Hello,

      Ich möchte die Zeichen aber nicht escaped haben.

      echo stripslashes($text);

      stripslashes() entfernt sie.

      man sollte aber vorher prüfen, ob magic_quotes_gpc in der php.ini überhaupt eingeschaltet ist. Wenn nämlich nicht, dann werden keine Slashes zum Escapen hinzugefügt.

      siehe: http://de3.php.net/manual/en/function.get-magic-quotes-gpc.php

      Und es soll sich mit einer folgenden PHP-Version sowieso erübrigen, weil das Feature dann abgeschafft werden soll. Ob die Funktion dann auch abgeschafft wird, vermag ich im Moment aber nicht zu sagen. Sinnvoll wäre es sicherlich, dass sie noch eine Generation fortbesteht...

      Es ist aber trotzdem durchaus sinnvoll, seine Scripte so zu schreiben, dass nicht einfach nur stumpf stripslashes() benutz wird, sondern erst geprüft wird, ob addslashes() überhaupt automatisch benutzt wurde.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  2. Hi!

    Wie gebe ich Text sicher und formatiert aus?
    Bisher habe ich es so gemacht: nl2br(htmlspecialchars($text))

    Das ist eine Behandlung der Ausgabewerte. Du sagst allerdings nicht, wohin du ausgibst. Je nach konkretem Medium sind eventuell andere Bearbeitungen erforderlich. htmlspecialchars($text) ist für HTML (und gegebenenfalls angepasst für XML) zuständig, das nl2br() ist ein Spezialfall, wenn du Zeilenumbrüche angezeigt bekommen möchtest, hat aber nichts mit "sicher" zu tun.

    das Problem ist aber wenn der Text so lautet:
    Hallo mein Name ist Franz, man nennt mich auch den "Goldfischbären".
    Dann sieht die Ausgabe so aus:
    Hallo mein Name ist Franz, man nennt mich auch den "Goldfischbären".

    Das ist nicht richtig. Denn der Text lautet zu dem Zeitpunkt tatsächlich "Goldfischbären" und nicht "Goldfischbären". Grund ist das bereits indirekt erwähnte und mittlerweile missbilligte (deprecated) Feature Magic Quotes. Das wird von PHP auf Werte angewendet, bevor sie dem Script in $_GET/$_POST/$_COOKIE zur Verfügung gestellt werden. Es soll SQL-Injection verhindern, aber es ist als Eingabedatenbehandlung fehlplatziert. Die Auswirkungen bekommst nun du zu spüren, weil du gar nicht nach SQL ausgeben willst sondern nach HTML.

    Grundsätzlich ist es günstig, wenn man seine Verrbeitung nach dem EVA-Prinzip trennt. Eingabedaten behandeln/prüfen, Verarbeitung der Daten, Ausgabe. Das Entfernen der Magic Quotes zählt zur Eingabedatenbehandlung, also solltest du sie ganz am Anfang vornehmen, oder besser noch das Feature Magic Quotes komplett ausschalten, denn es verbraucht nur unnötig Zeit. Als Konsequenz daraus musst du dann auch die Daten bei jeglicher Ausgabe (auch zum DBMS hin) selbständig und kontextgerecht behandeln. Den Artikel über Kontextwechsel hat ja Tom schon verlinkt.

    Lo!