12

目前我正在将此代码与 HTMLPurifier 一起使用以允许data-*HTML 标记属性:

    $def = $config->getHTMLDefinition(true);
    $def->addAttribute('div', 'data-aaa', 'Text');
    $def->addAttribute('div', 'data-bbb', 'Text');
    // ...

有没有一种方法可以一次允许所有data-*属性,最好在所有 HTML 标记上使用?(就我而言,它们不是安全问题——当然据我所知)

4

3 回答 3

7

这不是一个完整的解决方案,但我能够data-使用以下代码将单个属性全局列入白名单,允许将它们放置在任何元素上,而无需逐项列出每个属性的每个元素类型。

$def = $config->getHTMLDefinition(true);
$def->info_global_attr['data-aaa-xxx'] = new HTMLPurifier_AttrDef_Text;
$def->info_global_attr['data-bbb-yyy'] = new HTMLPurifier_AttrDef_Text;
$def->info_global_attr['data-ccc-zzz'] = new HTMLPurifier_AttrDef_Text;
于 2015-03-10T15:08:50.860 回答
1

不,不修改验证属性策略是不可能的。

于 2013-06-13T19:20:13.087 回答
0

这个编码可以改进,但我改变了 AttrValidator.php 我添加了以下函数:

    /*=======================================
    ==--    LLS start wildcard handling
    ==--
    ==--    data-*          ^data-(((?![\s=]).)+)
    =========================================*/
    private function checkWildCardAttributes($deflist, $attr_key, $value, $config, $context) {
        $result = false;
        foreach ($deflist as $def_key => $def_value) {
            if (strpos($def_key, '*') !== FALSE) {
                // found a wildcard
                // does wildcard match this attr
                $re = implode('(((?![\s=]).)+)',explode("*",$def_key));
                preg_match('#^'.$re.'#',$attr_key,$wcout);
                if (count($wcout)>0) {
                    // the attribute matched against the wildcard definition
                    $result = $deflist[$attr_key]->validate(
                        $value,
                        $config,
                        $context
                    );
                    break;
                }
            }
        }
        return $result;
    }

在函数 validateToken 中找到以下行:

// put the results into effect

在此行之前添加以下内容:

                /*=======================================
                ==--    start wildcard handling
                =========================================*/
                if (!$result) {
                    // definitions
                    $result = $this->checkWildCardAttributes($defs, $attr_key, $value, $config, $context);
                    if (!$result) {
                        // global definitions
                        $result = $this->checkWildCardAttributes($d_defs, $attr_key, $value, $config, $context);
                    }   
                }   
                //=======================================


            // put the results into effect
            if ($result === false || $result === null) {

在此之后,您可以在属性定义中使用 * 通配符。例子:

    // See: AttrValidator.php in the HTMLPurifier for the wildcard addition
    $def->info_global_attr['data-*'] = new HTMLPurifier_AttrDef_Text;               

就像我说的,它可以改进......但它确实有效:)

玩得开心....

于 2019-03-23T11:35:49.510 回答