【发布时间】:2011-02-07 23:31:12
【问题描述】:
根据the HTML Purifier smoketest,“格式错误”的 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 自己的库功能/注入器/插件/whathaveyou。
参考点:处理属性
有条件地删除 HTMLPurifier 中的 属性 很容易。这里库提供类HTMLPurifier_AttrTransform,方法是confiscateAttr()。
虽然我个人不使用 confiscateAttr() 的功能,但我确实使用HTMLPurifier_AttrTransform 按照this thread 将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 的出色解析功能。
不幸的是,在 HTMLPurifier_AttrTransform 的子类中返回 null 并不能解决问题。
任何人有任何聪明的想法,还是我被正则表达式困住了? :)
【问题讨论】:
-
我想我正在寻找同样的东西?看看我的帖子stackoverflow.com/questions/2646240/…你明白了吗
标签: php html-parsing htmlpurifier html