HTML Purifier: Entfernen eines Elements bedingt basierend auf seinen Attributen

As per the HTML Purifier smoketest, 'fehlerhafte' URIs werden gelegentlich verworfen, um ein Attribut-freies Anker-Tag zu hinterlassen,

<a href="javascript:document.location='http://www.google.com/'">XSS</a> wird<a>XSS</a>

... sowie gelegentlich auf das Protokoll reduziert, z. B.

<a href="http://1113982867/">XSS</a> wird<a href="http:/">XSS</a>

Während das an sich unproblematisch ist, ist es ein bisschen hässlich. Anstatt zu versuchen, diese mit regulären Ausdrücken zu entfernen, wollte ich die Bibliotheksfunktionen / injectors / plug-ins / whathaveyou von HTML Purifier verwenden.

Referenzpunkt: Attribute behandeln

Bedingte Entfernung einesAttribu in HTMLPurifier ist einfach. Hier bietet die Bibliothek die KlasseHTMLPurifier_AttrTransform mit der MethodeconfiscateAttr().

Während ich die Funktionalität von @ nicht persönlich benutconfiscateAttr(), Ich benutze einHTMLPurifier_AttrTransform wie prodieser Thread hinzufügentarget="_blank" an alle Anker.

// more configuration stuff up here
$htmlDef = $htmlPurifierConfiguration->getHTMLDefinition(true);
$anchor  = $htmlDef->addBlankElement('a');
$anchor->attr_transform_post[] = new HTMLPurifier_AttrTransform_Target();
// purify down here

HTMLPurifier_AttrTransform_Target ist natürlich eine sehr einfache Klasse.

class HTMLPurifier_AttrTransform_Target extends HTMLPurifier_AttrTransform
{
    public function transform($attr, $config, $context) {
        // I could call $this->confiscateAttr() here to throw away an
        // undesired attribute
        $attr['target'] = '_blank';
        return $attr;
    }
}

Dieser Teil funktioniert natürlich wie ein Zauber.

Behandlung von Elementen

Vielleicht schiel ich nicht fest genug aufHTMLPurifier_TagTransform, oder suche an der falschen Stelle (n) oder verstehe es im Allgemeinen nicht, aber ich kann anscheinend keine Möglichkeit finden, @ bedingt zu entferne elements.

Say, etwas zum Effekt von:

// more configuration stuff up here
$htmlDef = $htmlPurifierConfiguration->getHTMLDefinition(true);
$anchor  = $htmlDef->addElementHandler('a');
$anchor->elem_transform_post[] = new HTMLPurifier_ElementTransform_Cull();
// add target as per 'point of reference' here
// purify down here

Mit der Cull-Klasse wird etwas erweitert, das ein @ hconfiscateElement() Fähigkeit oder vergleichbar, wobei ich nach einem fehlenden @ suchen könnhref Attribut oder einhref Attribut mit dem Inhalthttp:/.

HTMLPurifier_Filter

Ich verstehe, dass ich einen Filter erstellen könnte, aber die Beispiele (Youtube.php und ExtractStyleBlocks.php) legen nahe, dass ich reguläre Ausdrücke verwenden würde, die ich wirklich lieber vermeiden würde.wenn es überhaupt möglich ist. Ich hoffe auf eine Onboard- oder Quasi-Onboard-Lösung, die die hervorragenden Parsing-Funktionen von HTML Purifier nutzt.

Returningnull in einer Kinderklasse vonHTMLPurifier_AttrTransform schneidet es leider nicht.

Jemand hat irgendwelche klugen Ideen, oder bin ich mit Regexen fest? :)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage