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 behandelnBedingte 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 ElementenVielleicht 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:/
.
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? :)