В соответствии с тестом на очиститель HTML , «неправильно сформированные» URI иногда отбрасываются, оставляя после себя тег без привязки, например
<a href="javascript:document.location='http://www.google.com/'">XSS</a>
становится <a>XSS</a>
... а также время от времени сокращаются до протокола, например
<a href="http://1113982867/">XSS</a>
становится <a href="http:/">XSS</a>
Хотя это без проблем, само по себе это немного уродливо. Вместо того чтобы пытаться избавиться от них с помощью регулярных выражений, я надеялся использовать собственные возможности библиотеки HTML Purifier / injectors / plug-ins / whathaveyou.
Точка отсчета: Обработка атрибутов
Условное удаление атрибута в HTMLPurifier легко. Здесь библиотека предлагает класс HTMLPurifier_AttrTransform
с методом confiscateAttr()
.
Хотя я лично не использую функциональность confiscateAttr()
, я использую HTMLPurifier_AttrTransform
согласно этой теме , чтобы добавить target="_blank"
ко всем якорям.
// 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
очень простой класс, конечно.
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;
}
}
Эта часть, естественно, работает как шарм.
Элементы обработки
Возможно, я недостаточно щурился на HTMLPurifier_TagTransform
, или смотрю не в том месте (ах), или вообще не понимаю, но я не могу найти способ условно удалить элементы .
Скажите, что-то с эффектом:
// 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
С классом Cull, расширяющим что-то, обладающее способностью confiscateElement()
или сопоставимым, в котором я мог бы проверить отсутствие атрибута href
или атрибута href
с содержимым http:/
.
HTMLPurifier_Filter
Я понимаю, что мог бы создать фильтр, но примеры (Youtube.php и ExtractStyleBlocks.php) предполагают, что в этом я бы использовал регулярные выражения, которых я действительно предпочел бы избежать, , если это вообще так. возможно . Я надеюсь на встроенное или квази-встроенное решение, которое использует превосходные возможности парсинга HTML Purifier.
Возвращение null
в дочернем классе HTMLPurifier_AttrTransform
, к сожалению, не сокращает его.
У кого-нибудь есть какие-нибудь умные идеи, или я застрял в регулярных выражениях? :)