Javascript aus Link filtern

andy72

Erfahrenes Mitglied
Hallo,

habe eben mitbekommen, dass ich einen Fehler in meinem PHP-Script habe:
Ich benutze in einem eigenen gebauten Forum als Editor TinyMCE, um dem User
a) die eingabe zu erleichtern und b)restriktiv zu vermeiden, dass er Eingaben macht,
die das System schädigen könnten.

meine Vorgehensweise ist folgend, nach absenden des Formulars prüfe ich
1.) ob die Eingabe Leer ist
2.) Erlaube ich mit striptags() im PHP nur Schreibstile (Fett, Underline etc)
3.) Seit gestern wollte ich auch Hyperlinks erlauben, jedoch kommt da mein Problem...

nach dieser Prüfung mache ich ein "addslashes()" sowie intval() bei Int-Werten wo ich keine anderen Zeichen benötige und htmlentities(), was mir eine SQL-Injection verhindert,
und beim lesen natürlich umgekehrt, um den Urzustand der Eingabe wieder herzustellen.

Mein eigentliches Problem ist nun, dass ich bemerkt habe, dass man mir Javascript
unterjubeln kann, wenn man einen Link hinzufügt - gibt es eine Möglichkeit, aus einem Link Javascript radikal zu entfernen und durch ein "#" zu ersetzen ?

LG & vielen Dank
Andy
 
Hallo,

du kannst mit einem Regulären Ausdruck vorgehen. Etwa in der Art:


PHP:
$text = preg_replace('/<a.*href="(.*?)".*>(.*?)<\/a>/sU', '<a href="$1">$2</a>', $text);

Grüße
 
Danke, Saftmeister ;)

Eine Frage habe ich dazu noch:
Nach was muss ich alles suchen, um direkt unter "$1" Javascript zu verhindern ?
Ich denke, nur "javascript:" oder ? Anderes funktioniert ja dann eh nicht,wenn diese Zeichenkette nicht drin ist, ausser reguläre Hyperlinks ?

LG
Andy
 
Du könntest anschließend noch folgendes machen:

PHP:
$text = preg_replace('/<a href=\"javascript.*>(.*?)<\/a>/sU', '$1', $text);

Das sollte die HTML-Tags von JS-Links wegfiltern, stattdessen nur den Text zwischen <a> und </a> zulassen.
 
Arbeite lieber mit einer Positiv- statt einer Negativliste. Gib also lieber die erlaubten statt die unerlaubten Werte an, das ist sicherer.
 
Du solltest auch beachten, dass man dir bei allen anderen HTML-Elementen ebenfalls Javascript unterjubeln kann. Eine Überprüfung der Link-Tags alleine reicht hier also nicht aus.

PHP:
// fuer alle HTML-Tags (schließt jedoch auch Links ein)
// muesstest du also noch eine Funktion o.ä. schreiben
$text = preg_replace('#<([a-z]+)(\s[^>]*)?>#is','<\\1>',$text);

// fuer Links
$text = preg_replace('#<a[^>]+href="[\s]*(javascript:)?([^"]*)"[^>]*>#is','<a href="\\2">',$text);

Grundsätzlich solltest du den Rat von Gumbo beherzigen und lieber definieren, was erlaubt ist.
 
Zuletzt bearbeitet:
Zurück