24. November 2006, 07:40, by Kevin

Input-Filtering mit der PHP DOM Extension

“Ersetze doch dieses TEXTAREA für dieses Forum mit einem Wysiwyg-Editor.” Wysiwyg, ein Wort, das allen farbengeilen, smileysliebenden Formatierfreunden sofort ein Lächeln auf das Gesicht zaubert. Anders beim Entwickler, die Sorgenfalten auf dem Gesicht sind unübersehbar: “Na danke, wieder 10 neue Dinge auf die ich im Bezug auf Sicherheit der Applikation und des Inhalts achten muss”.

WYSIWYG-Editor

User können eigene Bilder direkt in den Text einfügen? Deaktivieren wir dieses Feature doch gerade, damit können wir uns immerhin schon ein paar Scherereien (XSS!) vom Leib halten. Aber Moment, wir haben da ja einen iFrame mit dem Attribut designMode='on', das heisst dann soviel wie: “ja, man kann irgend ein Bild von irgend einer Seite nehmen, Ctrl-C,Ctrl-V und schwups ist man durch das Hintertürchen durch”. Clientseitige Überprüfung mit Javascript? Was ist nun, wenn jemand den Form-POST von Hand zusammenbastelt? Dann bringt diese Validierung nichts mehr

Folglich bleibt noch die serverseitige Überprüfung. Aber reicht es uns wirklich, etwaige Bilder oder Links mit strip_tags() oder ähnlichem herauszufiltern? Wohl kaum, schliesslich soll dem Member unter anderem die Möglichkeit gegeben werden über den Wysiwyg-Editor vorbereitete Smileys einzufügen. Wie unterscheidet man jetzt zwischen Memberbildern und Smileys? Den Smileys eine eindeutige Id zuordnen und über diesen Wert entscheiden ob es sich um ein Smiley handelt? Haha, der war gut. Die Lösung heisst in diesem Fall DOM:

$s_messageText=<< Ciao Silvan Heute habe ich etwas mit DOM gespielt...


EOT;

$o_domDocument = new DOMDocument();
$o_domDocument->loadHTML($s_messageText);
$o_images = $o_domDocument->getElementsByTagName(‘img’);
$o_node = $o_domDocument->documentElement;

foreach($o_images as $o_value)
{
$s_imageSource = $o_value->getAttribute(‘src’);
$a_urlArray = parse_url($s_imageSource);

if($a_urlArray[‘host’]!=’images.tilllate.com’)
{
$o_value->parentNode->removeChild($o_value);
}

}

$s_strippedString = $o_domDocument->saveHTML();

Wir laden den eingebenenen Text über loadHTML ins Objekt, durchforsten Dieses nach dem img-Tag und überprüfen für jedes Bild die Quelle. Bilder, welche von unseren Servern kommen, lassen wir aus: Es handelt sich ja um unsere harmlosen Smileys. Entspricht ein Bild nicht unseren Vorgaben, wird es über die Methode removeChild() entfernt. Den gesäuberten String können wir nun weiter verarbeiten. Die Überprüfung des Hosts könnte man natürlich noch besser mit einer Regular Expression lösen(z.B. wenn wir Bilder von allen tilllate-Servern zulassen wollten), in diesem Beispiel belassen wir es aber bei der einfachen Möglichkeit.
Sicher, nur eine der vielen Einsatzmöglichkeiten von DOM aber in diesem Fall eine praktische und elegante Lösung.

Interessiert? http://ch2.php.net/dom

Filed under: Programming,Web Development

3 Comments

  1. DOM rocks :) (muss ich ja sagen).

    Für Inputfiltering benutzen wir jeweils noch die tidy extension, bevor wir das überhaupt prozessieren. So können wir davon ausgehen, dass schon mal sauberes HTML ins DOM reinkommt und nicht mit irgendwelchen schmutzigen HTML/XSS tricks, die einige Browser wider common sense trotzdem interpretieren, verseucht ist :)

    Aber evt. schmeisst loadHTML das auch schon alles weg, hab ich jetzt gar nie getestet..

    Comment by Chregu — 24. November 2006 @ 08:30

  2. Heeeey, PHP-Gott Chregu liest den tilllate-Techblog… Welche Ehre! :D

    Messi für den Tipp!

    Comment by Silvan Mühlemann — 24. November 2006 @ 11:31

  3. Klar doch, sind ja auch gut geschriebene Artikel hier :)

    Comment by Chregu — 24. November 2006 @ 11:45

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

© 2017 tilllate Schweiz AG - Powered by WordPress