RegEX element rausfiltern, ob nun " davor oder nicht

B

ByeBye 8492

Moinsen, habe folgendes Problem, ich will in einem Eingabefeld jegliche Chance nehmen JavaScript zu benutzen ... dafür will ich nun einfach alle möglichen JavaScipt sachen rausfiltern, dies will ich bei der Eingabe mittels eines RegEXps machen, die allerdings Filtern soll, ob nun " davor sind oder nicht, wäre ja dumm weil sonst könnten die Personen immer noch JavaScript benutzen, wenn sie einfach vorne ein " und nicht nichts schreiben und ich diesen Fall vergessen habe.

$text = preg_replace('onclick=("|)(.*?)("|)/is',"", $text);
 
Wenn, dann sollten auch alle ‚Event-Elemente‘ herausgefiltert werden:
PHP:
<?php
	$events = array(
		'onload',
		'onunload',
		'onclick',
		'ondbclick',
		'onmousedown',
		'onmouseup',
		'onmouseover',
		'onmousemove',
		'onmouseout',
		'onfocus',
		'onblur',
		'onkeypress',
		'onkeydown',
		'onkeyup',
		'onsubmit',
		'onreset',
		'onchange'
	);
	$subject = '<a href="bla" onChange="bla"  onclick=bla>text</a>';
	$pattern = '/[\s]*('.implode('|', $events).')=(["\']?)([^>]*)?\\2/is';
	echo htmlentities(preg_replace($pattern, '', $subject));
?>
Achtung: Das Suchmuster lautet &#39;/[\s]*(&#39;.implode(&#39;|&#39;, $events).&#39;)=(["\&#39;]?)([^>]*)?\\2/is&#39;. Dies wird wegen der nicht ausgereiften Formatierungsfunktion innerhalb des Quellcode-Elements möglicherweise nicht korrekt dargestellt.
 
Original geschrieben von Gumbo
Wenn, dann sollten auch alle ‚Event-Elemente‘ herausgefiltert werden:
PHP:
<?php
	$events = array(
		'onload',
		'onunload',
		'onclick',
		'ondbclick',
		'onmousedown',
		'onmouseup',
		'onmouseover',
		'onmousemove',
		'onmouseout',
		'onfocus',
		'onblur',
		'onkeypress',
		'onkeydown',
		'onkeyup',
		'onsubmit',
		'onreset',
		'onchange'
	);
	$subject = '<a href="bla" onChange="bla"  onclick=bla>text</a>';
	$pattern = '/[\s]*('.implode('|', $events).')=(["\']?)([^>]*)?\\2/is';
	echo htmlentities(preg_replace($pattern, '', $subject));
?>
Achtung: Das Suchmuster lautet &#39;/[\s]*(&#39;.implode(&#39;|&#39;, $events).&#39;)=(["\&#39;]?)([^>]*)?\\2/is&#39;. Dies wird wegen der nicht ausgereiften Formatierungsfunktion innerhalb des Quellcode-Elements möglicherweise nicht korrekt dargestellt.

Ich hätte ja noch nach allen gesucht ;), wollte nur nen Denkansatz haben :), thx, für die Funktion werde sie noch nen bisschen überarbeiten :).


EDIT: Ich muss sie wohl nen bisschen überarbeiten, irgendwo ist da ein " oder ' Fehlplatziert .. da ich das Suchmuster nicht verstehe, kann ich es leider nicht korrigieren :(
 
Zuletzt bearbeitet von einem Moderator:
Ich weiss garnicht so recht, wozu du das machen willst.

Da du das ganze mit htmlentities behandelst, kann da doch überhaupt nix passieren.
Die Javascript-Aufrufe, welche da eventuell hineingeschrieben werden, werden doch bereits dadurch entschärft, dass der jeweilige Tag, in welchem sie standen, in &amp;lt;tag&amp;gt; umgewandelt wird.....damit wird gänzliches Javascript-Zeugs zu normalem Fliesstext.
 
Original geschrieben von fatalus
Ich weiss garnicht so recht, wozu du das machen willst.

Da du das ganze mit htmlentities behandelst, kann da doch überhaupt nix passieren.
Die Javascript-Aufrufe, welche da eventuell hineingeschrieben werden, werden doch bereits dadurch entschärft, dass der jeweilige Tag, in welchem sie standen, in &amp;lt;tag&amp;gt; umgewandelt wird.....damit wird gänzliches Javascript-Zeugs zu normalem Fliesstext.

Ja, aber werden denn die <img> Tags noch dargestellt?

Was ist jetzt an der Funktion oben eigentlich kaputt
 
Original geschrieben von Muffinmampfer
Was ist jetzt an der Funktion oben eigentlich kaputt

Hinweis auf:
Original geschrieben von Gumbo
Achtung: Das Suchmuster lautet '/[\s]*('.implode('|', $events).')=(["\']?)([^>]*)?\\2/is'. Dies wird wegen der nicht ausgereiften Formatierungsfunktion innerhalb des Quellcode-Elements möglicherweise nicht korrekt dargestellt.
 
Original geschrieben von Muffinmampfer
Ja, aber werden denn die <img> Tags noch dargestellt?


Vergiss mein Posting besser....es bezog sich auf das htmlentities() in Gumbos Code....das war da aber sicher nur zur Veranschaulichung gedacht.

Zur Sache ansich.....ich würde da wohl sicher darauf verzichten, Code direkt eingeben zu lassen.
Es wäre ja mit den JS-Sachen nicht getan, es gäbe Hunderte von Möglichkeiten, böses zu tun.....ein <object>-Tag, ein nicht geschlossenes Attribut in einem Tag, ein geöffneter Kommentar, selbst bei den JS-Sachen wird es schwer sein, alle findigen Köpfe auszutricksen...einen Weg findet man immer :-)


Da BB-Code wahrscheinlich nicht in Betracht kommt(ich schätze, es geht um deinen WYSIWYG-Editor), fällt mir auch nix passendes ein....was du bräuchtest, ist ein Validator, welcher nebenbei noch ein paar unerwünschte Sachen filtert....und das ist eine recht komplexe Sache.
 
Zuletzt bearbeitet:
Original geschrieben von fatalus
Vergiss mein Posting besser....es bezog sich auf das htmlentities() in Gumbos Code....das war da aber sicher nur zur Veranschaulichung gedacht.

Zur Sache ansich.....ich würde da wohl sicher darauf verzichten, Code direkt eingeben zu lassen.
Es wäre ja mit den JS-Sachen nicht getan, es gäbe Hunderte von Möglichkeiten, böses zu tun.....ein <object>-Tag, ein nicht geschlossenes Attribut in einem Tag, ein geöffneter Kommentar, selbst bei den JS-Sachen wird es schwer sein, alle findigen Köpfe auszutricksen...einen Weg findet man immer :-)


Da BB-Code wahrscheinlich nicht in Betracht kommt(ich schätze, es geht um deinen WYSIWYG-Editor), fällt mir auch nix passendes ein....was du bräuchtest, ist ein Validator, welcher nebenbei noch ein paar unerwünschte Sachen filtert....und das ist eine recht komplexe Sache.

Also praktisch habe ich BB Code ;).
Da ich ja nicht nur einen Editor habe, sondern 3 verschiede. Praktisch wird die Eingabe vorgenommen --> in BB-Code umgewandelt --> wieder zurück umgewandelt, so filtert man schon ein paar Elemente heraus, ich könnte natürlich auch einfach nur den BB-Code in der Datenbank stehen lassen.

Mir gehts halt nur darum, das schädlicher Code draußen ist ;), der <object> Tag fliegt sowieso gleich raus, weil der nicht durch die strip_tags() Prüfung durchkommt.

EDIT: Ich habe jetzt einfach mal die HTML Freigaben wie <img> aus der Prüfung rausgenommen und über den <img> können nun keine "Gefährlichen" Eingaben kommen :D, allerdings werden nun halt auch alle Grafiken rausgehauen, die nicht dem Standart entsprechen. So ein Editor macht extrem viel arbeit :heul:

EDIT2: Was meinste mit Code "direkt" eingeben lassen?

Also bei mir können meine CMS User dann später über einen Editor, praktisch wie hier im Forum, News, etc. verfassen und diese dann einsenden. Mit HTML _Entities habe ich das Problem, das vielleicht sinnvolle HTML Tags auch unbrauchbar werden, wobei die dann eigentlich schon lange in BB-Code umgewandelt sein könnten.

Ist es Sinnvoller bei der Eingabe, bei der Ausgabe wird nichts mehr kontrolliert .. ( aus gründen der Performance werden alle Prüfungen bei der Eingabe erledigt ), mit strip_tags oder mit html_entities zu arbeiten? Bei dem einen fallen die ja komplett raus, beim anderen stehen sie dann da, als komplette HTML Tags. Der BB-Code Editor ist ja nicht so das Problem, da wird einfach alles gelöscht, was nicht BB-Code ist. Beim WYSIWYG Editor ist wieder das Probelm der Tausenden Kombinationen da. So gibt der IE manchmal zig verschieden Kombinationen für einen Tag raus, der die Farben kodieren soll, mal mit " mal ohne, irgendwie steckt da kein System hinter, beim FireFox ist es genau das gleiche. Zusätzlich macht es einen Unterschied ob man Bilder einfach reinkopiert oder nicht.....

Am besten wäre es wohl, wenn ich den WYSIWYG Editor einfach nicht für den UserBereich zugänglich mache, oder wenn dann nur über eine Extra Option damit der Admin weiß worauf er sich einlässt ...
 
Zuletzt bearbeitet von einem Moderator:
Zurück