HTML Eingaben in PHP filtern und ausgeben

Folgendes Beispiel: Ein Eingabefeld, in das der User HTML Code eingeben kann und nach Absenden des Formulars soll sowohl das HTML ausgewertet ausgegeben werden als auch die ursprüngliche Eingabe im Eingabefeld erneut bearbeitet werden können.
Eingabe:Eingabe

Ausgabe:Ausgabe der gefilterten Eingabe

Wichtig ist hierbei die Eingabe über FILTER_SANITIZE_SPECIAL_CHARS oder FILTER_SANITIZE_FULL_SPECIAL_CHARS zu filtern. Die SANITIZE* Filter sorgen dafür, dass auch eine Bereinigung der Werte stattfindet. Hierbei werden Zeichen wie “<>& in HTML Entitäten umgewandelt, Tags bleiben allerdings erhalten. Ein Anführungsstrich wird bspw. zu

"

FILTER_SANITIZE_STRING geht hier zuweit, da auch HTML Tags entfernt werden. Sind magic_quotes aktiv, ist vor dem kaufmännischen Und noch ein Backslash.
Zur Ausgabe, in der das HTML ausgewertet werden soll muss html_entity_decode angewendet werden. Hierdurch werden die Zeichen für die Ausgabe wieder zurück in HTML gewandelt, das vom Browser interpretiert wird.
Ausnahme: Für die Ausgabe in einem Input-Feld sollen aber die Anführungszeichen nicht in HTML zurückgewandelt werden, da sonst der HTML Quellcode defekt ist (Anführungszeichen im value Attribut, das selbst Anführungszeichen enthäkt). Daher muss hier ENT_NOQUOTES aktiviert werden, um die Anführungszeichen nicht zurück zu wanddeln. Vergisst man dies, kommt beim value des input Feldes ein falsches Ergebnis heraus (drei Anführungsstriche) und die HTML Ausgabe ist invalide.

$output_field = '';
if(isset($_POST['submit'])) 
{ 
	$filtered = filter_var($_POST['in'], FILTER_SANITIZE_SPECIAL_CHARS);
	$output_page = html_entity_decode($filtered);
	$output_field = html_entity_decode($filtered, ENT_NOQUOTES);
	echo '<h1>OUTPUT:</h1>';
	echo $output_field.'<br />';
}

?> 

<hr />

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
   <input type="text" name="in" value="<?php echo $output_field;?>"><br>
   <input type="submit" name="submit" value="Submit Form"><br>
</form>


Als erster einen Kommentar schreiben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.