Heyho!
»» Ok, damit ich sicher bin, dass ich alles richtig verstanden habe, bitte folgende Statements einmal absegnen:
Nö. Deine Statements sind mir zu allgemein.
Entscheidend für die Wahl der korrekten Codierung der Ausgabe ist, in welchem Kontext sie eingesetzt wird.
Ja, das dachte ich hätte ich in dem "Exkurs" ausführlich genug erklärt. Aber ok, dann noch ausführlicher ;-)
Das ganze ist wie gesagt ein CMS, wo im Backend der Benutzer Inhalt eingeben kann, der dann im Frontend angezeigt wird (ok, so läuft's wohl meistens ;-) ). Dabei arbeitet der User (vereinfacht gesagt) "Boxweise", sprich, er kann Inhaltsboxes auf einer Seite anlegen. Die haben einen Titel und einen Body. Der Titel darf kein HTML enthalten (der Text wird einfach in eine <h1>-Überschrift gepackt), der Body darf hingegen formatiert werden (mit den Bordmitteln von TinyMCE).
Die Ausgabe ist template-basiert, mit Smarty, aber das ist wohl hier eher egal.
Nach dem, was ich hier gehört habe, würde die Ausgabe in etwa so ablaufen (wie gesagt, in echt ist's template-basiert, sodass ich kein HTML/PHP-Gemisch habe)
<div>
<h1><?php echo(htmlspecialchars($divTitle)); ?></h1>
<?php echo(strip_tags($divBody, ALLOWED_HTML); ?>
</div>
Der Body darf die gängigen Textformatierungs-Tags enthalten (fett, kursiv, unterstrichen, farbig, Listen, Tabellen). Der Rest wird weg-gestrippt.
Die dazugehörigen Formularfelder erhalten beim Editieren die alten Werte über htmlspecialchars:
<input type="text" name="divTitle" id="divTitle" value="<?php echo(htmlspecialchars($divTitle)); ?>" />
<textarea class="tinyMCE" name="divBody" id="divBody"><?php echo(htmlspecialchars($divBody)); ?></textarea>
In der DB wird alles unmaskiert gespeichert, wie bereits gesagt.
Brauchst du noch mehr Informationen? Das oben ist nur Beispielcode, in Wahrheit ist das etwas komplizierter. Aber ist hier nicht wichtig ;-)
Warum kann man nicht für meinen Fall generell sagen, dass
* htmlspecialchars() benutzt werden soll, wenn man HTML nicht interpretiert haben möchte (im divTitle und bei den values der Formularfelder)
* diese Spezialmethode mit strip_tags() benutzt werden soll, wenn vom Benutzer eingegebenes HTML ausgegeben und interpretiert werden soll (wie beim divBody)
So würde das für mich Sinn machen.
»» 3) Ich sollte meine Spezialfunktion "htmlentitiesHTML()" dahingehend reduzieren, dass nur die ungewollten Tags per strip_tags() eliminiert werden. Maskierungen per htmlentities() oder htmlspecialchars() machen keinen Sinn, da Inhalt als HTML interpretierbar bleiben soll.
Das sind zwei Paar Schuhe: Das eine ist die Validierung und Säuberung des Codes, der aus dem TinyMCE kommt, das andere ist die Codierung der Ausgabe entsprechend Kontext.
Das ist mir klar. Ich wollte das ganze Thema auf die "Anwendungsebene" hochziehen, also was für mich gerade am meisten Sinn macht. Ach das passt schon, oben hab ichs ja nochmal etwas weiter ausformuliert ;-)
Viele Grüße
Mastershrimp