BBCODE image Tag, CSRF verhindern

versuch13

Erfahrenes Mitglied
BBCODE image Tag, CSRF/XSS verhindern

Wie kann ich verhindern das in einem image Tag welches die src Angabe durch User Eingaben erhält schädlicher Code eingeschleust wird? htmlspecialchars?- ist das wirklich ausreichend? Reicht es HTML zu zu filtern, denn ich habe irgendwo gelesen man kann den code auch codiert einschleusen, irgendwie in der Form
Code:
%3Cscript%3Ealert('alert')%3C/script%3E
oder auch anders. Daher bin ich einfach nicht sicher wie ich die Daten maskieren bzw. filtern muss.

Edit: Ich habe gerade gelesen, das nennt sich wohl Metazeichen. Müssen diese Metazeichen
extra gefiltert bzw. maskiert werden?

Ich beziehe mich auf die Zeichen welche im Quelltext in image source Attribut ausgegeben werden.

Danke
 
Zuletzt bearbeitet:
Ich habs mir gerad mal angeschaut und musst dir keine Sorgen machen. Das Script Kiddy müsste, um htmlspecialchars zu umgehen schon pfiffiger sein^^

%3Cscript%3Ealert('alert')%3C/script%3E
Wenn ich genau sowas eingebe dann steht im Quelltext auch genau das. HTML braucht aber die Metazeichen <> direkt so und unkonvertiert das es als ein solches erkannt wird.
 
Ich habs mir gerad mal angeschaut und musst dir keine Sorgen machen. Das Script Kiddy müsste, um htmlspecialchars zu umgehen schon pfiffiger sein^^

%3Cscript%3Ealert('alert')%3C/script%3E
Wenn ich genau sowas eingebe dann steht im Quelltext auch genau das. HTML braucht aber die Metazeichen <> direkt so und unkonvertiert das es als ein solches erkannt wird.

Ja sorry das war natürlich ein blödes Beispiel da es sich gar nicht auf das einschleusen
von Code in ein image Tag anwenden lässt.

Ein besseres Beispiel ist:

echo '<img src="'.htmlentities("javascript:alert('xss')",ENT_QUOTES).'" />'
ausgabe: <img src="javascript:alert('xss')" />

ist zum Beispiel im IE6 ausführbar.

So, in meinem Fall jetzt sieht das so aus:

PHP:
	$img = stripslashes(htmlentities("[ img]javascript:alert('xss')[ /img]",ENT_QUOTES));
	$img = preg_replace('#\[ img\](.*)\[ /img\]#Uis', '<img src="\1" />', $img);
	echo $img;

Nun müßte ich wohl den Teil der ins src Attribut eingesetzt wird nochmals
extra filtern, nur auf was alles und wie stelle ich das an?


Edit: Also ich bin etwas weiter gekommen, bin mir nur nicht sicher ob
es ausreichend ist:

PHP:
		if(preg_match('#\[ img\].*(script:|style:).*\[ /img\]#Uis', $text)) {
			$text = preg_replace('#\[ img\].*(script:|style:).*\[ /img\]#Uis', 'XSS Warning', $text);	
		}
 
Zuletzt bearbeitet:
Wie sieht es mit urlencode aus? Kann ja sein, dass jemand ein Bild mit dem Namen "javascript:alert('xss').png" hat.

Ausserdem kann Du doch einfach überprüfen, ob http:// oder ftp:// oder https:// (oder welche Protokolle du auch immer unterstützen willst/kannst) am Ende steht?

Zur sicherheit gegen "unicode Attacken" (k.A. wie man das nennen soll), d.h. wenn jemand in den Dateinamen das Unicodezeichen für den Richtungswechsel der Anzeige (-> arabischer Raum) benützen sollte, kannst du noch ptth am Ende verbieten.
 
Wie sieht es mit urlencode aus? Kann ja sein, dass jemand ein Bild mit dem Namen "javascript:alert('xss').png" hat.

Und wenn ich urlencode anwende wäre es dann sicher?

Ausserdem kann Du doch einfach überprüfen, ob http:// oder ftp:// oder https:// (oder welche Protokolle du auch immer unterstützen willst/kannst) am Ende steht?

Am Anfang meinst du? Das sichert mich ja aber nicht für den Fall aber dass jemand ein externes Javascript einbindet.


Ich habe noch fleißig gesucht aber keine richtige Lösung gefunden, nur Hinweise darauf dass es oft vernachlässigt wird, selbst verbreitet Foren Software ist da nicht immer ganz abgesichert, das kann ich nicht verstehen.
 
Gibt es nicht vllt auch eine Möglichkeit zu überprüfen ob es sich wirklich um einen Pfad zu einer Bilddatei handelt, auf die Endung .jpg .gif .png zum Beispiel?
 
Zurück