gpt4 book ai didi

php - HTML 净化器 : Removing an element conditionally based on its attributes

转载 作者:可可西里 更新时间:2023-10-31 22:16:44 27 4
gpt4 key购买 nike

根据 the HTML Purifier smoketest ,“格式错误”的 URI 有时会被丢弃以留下无属性的 anchor 标记,例如

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

...以及偶尔被剥离到协议(protocol)中,例如

<a href="http://1113982867/">XSS</a>变成 <a href="http:/">XSS</a>

虽然这本身没有问题,但有点难看。我没有尝试用正则表达式去除这些,而是​​希望使用 HTML Purifier 自己的库功能/注入(inject)器/插件/whathaveyou。

引用点:处理属性

在 HTMLPurifier 中有条件地删除一个 attribute 很容易。这里图书馆提供类(class) HTMLPurifier_AttrTransform使用方法 confiscateAttr() .

虽然我个人并不使用 confiscateAttr() 的功能,我确实使用了 HTMLPurifier_AttrTransform根据 this thread添加target="_blank"给所有 anchor 。

// 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 出色的解析功能。

返回 nullHTMLPurifier_AttrTransform 的子类中不幸的是没有削减它。

任何人都有任何聪明的想法,或者我是否受困于正则表达式? :)

最佳答案

成功了!感谢Ambush Commander and mcgrailm in another question ,我现在使用的是一个非常简单的解决方案:

// a bit of context
$htmlDef = $this->configuration->getHTMLDefinition(true);
$anchor = $htmlDef->addBlankElement('a');

// HTMLPurifier_AttrTransform_RemoveLoneHttp strips 'href="http:/"' from
// all anchor tags (see first post for class detail)
$anchor->attr_transform_post[] = new HTMLPurifier_AttrTransform_RemoveLoneHttp();

// this is the magic! We're making 'href' a required attribute (note the
// asterisk) - now HTML Purifier removes <a></a>, as well as
// <a href="http:/"></a> after HTMLPurifier_AttrTransform_RemoveLoneHttp
// is through with it!
$htmlDef->addAttribute('a', 'href*', new HTMLPurifier_AttrDef_URI());

它有效,它 works ,巴哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈g̀̄h̘̝͊̐ͩͥ̋ͤ͛g̦̣̙̙̒̀ͥ̐̔ͅh̘̝͊̐ͩͥ̋ͤ͛

关于php - HTML 净化器 : Removing an element conditionally based on its attributes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2638640/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com