如何在 HTMLPurifier 中允许 script、object、param、embed 和 iframe 标签?

Posted

技术标签:

【中文标题】如何在 HTMLPurifier 中允许 script、object、param、embed 和 iframe 标签?【英文标题】:How do I allow script, object, param, embed, and iframe tags in HTMLPurifier? 【发布时间】:2011-05-07 08:25:58 【问题描述】:

这是一种我想在 htmlPurifier 中允许的特殊标签组合,但似乎无法让该组合发挥作用。

我可以让脚本标签工作,但嵌入标签会被删除(我使用 HTML.Trusted = true 启用脚本标签)。当我重新嵌入标签时,脚本标签被删除(我删除了 HTML.Trusted)。以下是我的配置:

        $config->set('HTML.Trusted', true);
        $config->set('HTML.SafeEmbed', true);
        $config->set('HTML.SafeObject', true);
        $config->set('Output.FlashCompat', true);

我什至尝试添加以下使事情变得更糟的内容:

        $config->set('HTML.Allowed', 'object[width|height|data],param[name|value],embed[src|type|allowscriptaccess|allowfullscreen|width|height],script[src|type]');

另外,无论如何,我似乎都无法让 iframe 工作。我尝试添加:

        $config->set('HTML.DefinitionID', 'enduser-customize.html iframe');
        $config->set('HTML.DefinitionRev', 1);
        $config->set('Cache.DefinitionImpl', null); // remove this later!
        $def = $config->getHTMLDefinition(true);
        $iframe = $def->addElement(
            'iframe',   // name
            'Block',  // content set
            'Empty', // allowed children
            'Common', // attribute collection
            array( // attributes
                'src*' => 'URI#embedded',
                'width' => 'Pixels#1000',
                'height' => 'Pixels#1000',
                'frameborder=' => 'Number',
                'name' => 'ID',
            )
        );
        $iframe->excludes = array('iframe' => true);

任何有关使整个组合工作的帮助,甚至是带有对象/参数和嵌入的脚本标签,将不胜感激!!!

哦,是的,这显然不适合所有用户,只是“特殊”用户。

谢谢!

PS - 请不要将我链接到http://htmlpurifier.org/docs/enduser-customize.html


更新

我在这里找到了在线程底部添加 iframe 的解决方案:http://htmlpurifier.org/phorum/read.php?3,4646

现在的配置是:

        $config->set('HTML.Trusted', true);
        $config->set('HTML.SafeEmbed', true);
        $config->set('HTML.SafeObject', true);
        $config->set('Output.FlashCompat', true);
        $config->set('Filter.Custom',  array( new HTMLPurifier_Filter_MyIframe() ));

更新到更新

如果您对我在 HTMLPurifier 论坛中的评论有疑问,可能是因为我的意思是让方法看起来像这样:

public function preFilter($html, $config, $context) 
    return preg_replace("/iframe/", "img class=\"MyIframe\" ", preg_replace("/<\/iframe>/", "", $html));

【问题讨论】:

HTML 净化器摇滚!为什么我不想使用它? ;) 要真正正确,您可能应该扩展HTMLPurifier_Filter。解决方案虽然很棒;我正在使用这个但将我信任的域列入白名单(例如 youtube 的新 iframe 嵌入)。 【参考方案1】:

通过 HTMLPurifier Google 小组找到了解决方案(感谢 Edward Z. Yang !!!)。允许对象、嵌入和脚本标签同时存在于页面上的解决方案是从 HTMLModuleManager.php 的 __construct() 方法中的 $common 数组中删除“对象”。这当然会让任何人都无法添加对象标签,除非您在配置中指定它。

我现在的最终配置是:

        $config->set('HTML.Trusted', true);
        $config->set('HTML.SafeObject', true);
        $config->set('Output.FlashCompat', true);
        $config->set('Filter.Custom',  array( new HTMLPurifier_Filter_SafeIframe() ));

我真的希望这些说明可以帮助其他想要使用 HTMLPurifier 的开发人员。与我们最初用于从所见即所得编辑器中清理和清除传入文本的方法相比,HTMLPurifier 快了大约 85%!

【讨论】:

如何获得HTMLPurifier_Filter_SafeIframe 类的副本? 看到这个question

以上是关于如何在 HTMLPurifier 中允许 script、object、param、embed 和 iframe 标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JetBrains Rider 中允许不安全的代码?

C# - 如何在 OpenFileDialog 中允许多种文件类型?

如何在 ng-repeat 中允许重复?

如何在春季授权服务器中允许端点?

如何在 Glassfish 中允许该权限

如何在 Android WebView 中允许访问相机