• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Regexp: HTML Attribute

Cuthbert

New member
Hallo liebe Leser!

Ich beschäftige mich seit kurzem etwas mit den RegExp, besser gesagt ich versuche es - man kommt ja nicht drum rum.

Nun ist es so, dass ich liebend gerne den TINYMCE Editor benutze, jedoch kann man damit die Benutzer nicht einfach schreiben lassen was man will, sonst hat man ganz schnell ein onmouseover="window.location.href='...'" drinnen stehen :d

Nun wollte ich mittels PHP Attribute herausfiltern, das ganze sieht im Moment so aus:

PHP:
	$zeichenkette = stripslashes($var['TEXT']);
	$suchmuster = '/(onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|id|class|align)="(.*?)"/i';
	$ersetzung = "";
	$zeichenkette = preg_replace($suchmuster,$ersetzung,$zeichenkette);

	$ouput = closetags(strip_tags($zeichenkette,"<strong>,<em>,<span>,<div>,<img>,<p>,<br>,<b>,<blockquote>,<hr>"));

Das ganze Funktioniert zwar ist aber weder schön noch sonstwas. Außerdem beschränkt es sehr.

Was mir leider fehlt und wo ich auch leider nach stundenlangem Probieren nicht dahinterkomme ist, wie ich dann zb style="color:#xyz" entferne, aber jedoch style="text-align:justify;"

Konkret gesagt:
1) Grundsätzlich sollen alle Attribute verschwinden
2) Einige Attribute sollen bleiben (z.B.: width,height,style)
3) Beim style element sollen auch wieder nur bestimmte Inhalte erlaubt sein: (z.B.: style="text-align:left; color:#123456; font-size:1000px;" wird zu => style="text-align:left; color:#123456;")

Ich wäre euch sehr Dankbar wenn ihr mir helfen könnt.
Am meisten würde mich wohl der fertige RegExp Pattern freuen aber ein paar Anstöße werde ich auch sehr begrüßen!

Schöne Grüße
Cuthbert
 
tjoar, das is ja das Hauptproblem. Bräuchte mal ein kurzes Beispiel. Hab zwar bereits etwas gefunden, dass eigentlich den Pattern verneinen sollte, also teile daraus umkehren, funktioniert nur nicht.
 
dein vorhaben ist alles andere als trivial. folgende funktion habe ich aus dem manual von php.net:
PHP:
function strip_tags_attributes($sSource, $aAllowedTags = array(), $aDisabledAttributes = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavaible', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragdrop', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterupdate', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmoveout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload'))
    {
        if (empty($aDisabledAttributes)) return strip_tags($sSource, implode('', $aAllowedTags));

        return preg_replace('/\s(' . implode('|', $aDisabledAttributes) . ').*?([\s\>])/', '\\2', preg_replace('/<(.*?)>/ie', "'<' . preg_replace(array('/javascript:[^\"\']*/i', '/(" . implode('|', $aDisabledAttributes) . ")[ \\t\\n]*=[ \\t\\n]*[\"\'][^\"\']*[\"\']/i', '/\s+/'), array('', '', ' '), stripslashes('\\1')) . '>'", strip_tags($sSource, implode('', $aAllowedTags))) );
    }

$source="<big onmouseover=alert('Hello!')>Move your mouse here (this work with [ strip_tags_attributes corrected ])</big>";
$striped_source=strip_tags_attributes($source,array('<big>'));
echo($striped_source);
PHP: strip_tags - Manual
 
dein vorhaben ist alles andere als trivial. folgende funktion habe ich aus dem manual von php.net:
PHP:
function strip_tags_attributes($sSource, $aAllowedTags = array(), $aDisabledAttributes = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavaible', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragdrop', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterupdate', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmoveout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload'))
    {
        if (empty($aDisabledAttributes)) return strip_tags($sSource, implode('', $aAllowedTags));

        return preg_replace('/\s(' . implode('|', $aDisabledAttributes) . ').*?([\s\>])/', '\\2', preg_replace('/<(.*?)>/ie', "'<' . preg_replace(array('/javascript:[^\"\']*/i', '/(" . implode('|', $aDisabledAttributes) . ")[ \\t\\n]*=[ \\t\\n]*[\"\'][^\"\']*[\"\']/i', '/\s+/'), array('', '', ' '), stripslashes('\\1')) . '>'", strip_tags($sSource, implode('', $aAllowedTags))) );
    }

$source="<big onmouseover=alert('Hello!')>Move your mouse here (this work with [ strip_tags_attributes corrected ])</big>";
$striped_source=strip_tags_attributes($source,array('<big>'));
echo($striped_source);
PHP: strip_tags - Manual

Nunja, danke für den Beitrag. Habe etwas weiter darunter einen etwas hilfreicheren Gefunden:
PHP:
<?
function removeAttributes($htmlText)
{
       $stripAttrib = "'\\s(class)=\"(.*?)\"'i"; //remove classes from html tags;
       $htmlText = stripslashes($htmlText);
       $htmlText = preg_replace($stripAttrib, '', $htmlText);
       $stripAttrib = "/(font\-size|color|font\-family|line\-height):\\s".
              "(\\d+(\\x2E\\d+\\w+|\\W)|\\w+)(;|)(\\s|)/i";
//remove font-style,color,font-family,line-height from style tags in the text;
       $htmlText = stripslashes($tagSource);
       $htmlText = preg_replace($stripAttrib, '', $htmlText);
       $htmlText = str_replace(" style=\"\"", '', $htmlText); //remove empty style tags, after the preg_replace above (style="");
       return $htmlText;
}
function removeEvilTags($source)
{
   return preg_replace('/<(.*?)>/ie', "'<'.removeEvilAttributes('\\1').'>'", $source);
}
?>
Diese Funktion entfernt die angegebenen Style-Elemente. Ich möchte aber die nicht-angegebenen StyleElemente entfernen lassen.

Mein Ansatz wären:
PHP:
<?php 
 $text = '<p style="color:#123456; font-size:15px; font-weigt:bold; text-align:justify;" onclick="window.location.href" height="100%"><font>Text</font></p>';
 $text = strip_tags($text,"<p>,<em>,<span>,<div>");
 $text = preg_replace("/(<.*).*(!!!ALLES AUSSER STYLE;HREF;ALT!!!).*(.*>)/i","$1 $2 $3",$text);
 $text = preg_replace("/(<.*).*style=(!!!ALLES AUSSER TEXT-ALIGN;COLOR;...!!!).*(.*>)/i","$1 $2 $3",$text);
?>
Bräuchte noch jemanden ders unsetzten kann :>
 
Zurück
Oben