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!