Php HTMLPurifier iframe Vimeo和Youtube视频

Php HTMLPurifier iframe Vimeo和Youtube视频,php,video,iframe,xss,htmlpurifier,Php,Video,Iframe,Xss,Htmlpurifier,如何使用HTMLPurifier过滤xss,同时允许iframe Vimeo和Youtube视频 require_once 'htmlpurifier/library/HTMLPurifier.auto.php'; $config = HTMLPurifier_Config::createDefault(); $config->set('HTML.Trusted', true); $config->set('Filter.YouTube', true); $config->s

如何使用HTMLPurifier过滤xss,同时允许iframe Vimeo和Youtube视频

require_once 'htmlpurifier/library/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.Trusted', true);

$config->set('Filter.YouTube', true);
$config->set('HTML.DefinitionID', '1');
$config->set('HTML.SafeObject', 'true');
$config->set('Output.FlashCompat', 'true');

$config->set('HTML.FlashAllowFullScreen', 'true');

$purifier = new HTMLPurifier($config);
$temp = $purifier->purify($temp);

删除%HTML.Trusted、%Filter.YouTube和%HTML.DefinitionID。他们可能与SafeObject/FlashCompat的交互很差。

我刚刚读到,并成功创建和使用了自定义筛选器。我对代码做了一些更改,并添加了Vimeo支持:

/**
 * Based on: http://sachachua.com/blog/2011/08/drupal-html-purifier-embedding-iframes-youtube/
 * Iframe filter that does some primitive whitelisting in a somewhat recognizable and tweakable way
 */
class HTMLPurifier_Filter_MyIframe extends HTMLPurifier_Filter
{
    public $name = 'MyIframe';

    /**
     *
     * @param string $html
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     */
    public function preFilter($html, HTMLPurifier_Config $config, HTMLPurifier_Context $context)
    {
        $html = preg_replace('#<iframe#i', '<img class="MyIframe"', $html);
        $html = preg_replace('#</iframe>#i', '</img>', $html);
        return $html;
    }

    /**
     *
     * @param string $html
     * @param HTMLPurifier_Config $config
     * @param HTMLPurifier_Context $context
     * @return string
     */
    public function postFilter($html, HTMLPurifier_Config $config, HTMLPurifier_Context $context)
    {
        $post_regex = '#<img class="MyIframe"([^>]+?)>#';
        return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html);
    }

    /**
     *
     * @param array $matches
     * @return string
     */
    protected function postFilterCallback($matches)
    {
        // Domain Whitelist
        $youTubeMatch = preg_match('#src="https?://www.youtube(-nocookie)?.com/#i', $matches[1]);
        $vimeoMatch = preg_match('#src="http://player.vimeo.com/#i', $matches[1]);
        if ($youTubeMatch || $vimeoMatch) {
            $extra = ' frameborder="0"';
            if ($youTubeMatch) {
                $extra .= ' allowfullscreen';
            } elseif ($vimeoMatch) {
                $extra .= ' webkitAllowFullScreen mozallowfullscreen allowFullScreen';
            }
            return '<iframe ' . $matches[1] . $extra . '></iframe>';
        } else {
            return '';
        }
    }
}

HTMLPurifier版本4.4.0有新的配置指令,允许YouTube和Vimeo iFrame:

//allow iframes from trusted sources
$cfg->set('HTML.SafeIframe', true);
$cfg->set('URI.SafeIframeRegexp', '%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/)%'); //allow YouTube and Vimeo

使用drupal 7.19和htmlpurifier模块,您可以配置以下设置,而无需编写此代码


请看

这么多应该可以奏效

$text = "<iframe width='560' height='315' src='//www.youtube.com/embed/RGLI7QBUitE?autoplay=1' frameborder='0' allowfullscreen></iframe>";

require_once 'htmlpurifier/library/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.Trusted', true);
$config->set('Filter.YouTube', true);

echo $purifier->purify($text);
$text=”“;
需要一次'htmlpurifier/library/htmlpurifier.auto.php';
$config=HTMLPurifier_config::createDefault();
$config->set('HTML.Trusted',true);
$config->set('Filter.YouTube',true);
echo$purizer->purify($text);

也不要忘记设置

URI.DisableExternalResources: false

如果您之前已将其设置为
true

适用于有困难的人(如何启用iframe和allowfullscreen)

$config=\HTMLPurifier\u config::createDefault();
$config->set('HTML.SafeIframe',true);
$config->set('URI.SafeIframeRegexp','%^(https?:)?/(www\.youtube(?-nocookie)?\.com/embed/| player\.vimeo\.com/video/)%)//允许YouTube和Vimeo
//这一行在允许的元素中允许iframe很重要,否则它将无法工作
$config->set('HTML.AllowedElements',array('iframe');//set('HTML.AllowedAttributes','iframe@src,iframe@allowfullscreen');
$def=$config->getHTMLDefinition(真);
$def->addAttribute('iframe','allowfullscreen','Bool');
$punizer=new\HTMLPurifier($config);
$purifydhtml=$purizer->purify($html);
根据reverbnation的回答,我意识到由于某种原因

$def->addAttribute('iframe', 'allowfullscreen', 'Bool');
工作不正常,而不是

allowfullscreen="allowfullscreen"
HTMLPurifier正在输出

allowfullscreen=""
虽然说
Bool-Boolean属性只有一个有效值:属性的名称,但我尝试使用
Enum

$def->addAttribute('iframe', 'allowfullscreen', 'Enum#allowfullscreen');
第三个参数意味着
allowfullscreen
属性将只有正确的值--
allowfullscreen
,其他所有内容都将被忽略。这样,我们就有了与
Bool
相同的行为。幸运的是,它对我有效


也许这个解决方案会对某些人有所帮助。

如果框架仍然被阻止,请不要尝试。你知道另外一个使用iframe支持的好解决方案吗?哦,是的,你必须单独添加iframe支持。这里有一种可能的方法:当然,我们希望(最终)在核心适当地增加对它的支持。我尝试了这个解决方案,但我有个问题,这里是我最后的评论,为什么youtube切换到iFrame?为什么/绝望的cry@ElYobo因为HTML5视频一开始我并不为自己工作。但是后来我允许了img(因为过滤器使用img标签来实现这个魔术)并且成功了$config->set('HTML.Allowed'、'p,a[href | rel | target]、img[class | src | height | width]);它是否保留了YouTube的
allowfullscreen
属性和Vimeo的
webkitalowfullscreen
mozallowfullscreen
allowfullscreen
属性?没有,但在我的测试中,它对Flash或HTML5播放器都没有影响。不管怎样,全屏都能正常工作。另外,它不在规范中,所以忽略它可能是安全的。有关添加自定义属性的信息,请参阅。@Malte如何允许facebook视频iframe@PanagiotisKoursaris将它添加到正则表达式中,如so
%^(https?:)?/(www\.youtube(?-nocookie)?\.com/embed/| player\.vimeo\.com/video/| www\.facebook\.com/plugins/video.php\?)%
谢谢,尝试了所有可能的解决方案,但您的答案解决了它!万分感谢!你的答案解决了,但宽度、高度元素removed@VikasChauhan第6行它工作了,但当我将iframe设置为bool时它不工作,因为在youtube中嵌入代码-allowfullscreen=“”属性不工作。但是我改变了行-$def->addAttribute('iframe','allowfullscreen','Bool');到$def->addAttribute('iframe','allowfullscreen','Text');终于为我工作了…@sumeet如何也允许facebook视频iFrame刚刚添加了一行>$config->set('Filter.YouTube',true);这对我有用。谢谢:-)
allowfullscreen=""
$def->addAttribute('iframe', 'allowfullscreen', 'Enum#allowfullscreen');